队列:链表实现
结构描述:
| typedef int DataType; |
| typedef struct QueueNode { |
| DataType A; |
| struct QueueNode * Next; |
| }Node; |
| class QueueLinked { |
| public: |
| |
| Node * Front; |
| Node * Next; |
| |
| |
| |
| void Push(DataType X); |
| |
| void Pop(); |
| |
| void MakeEmpty(); |
| |
| bool IsEmpty(); |
| |
| void Init(); |
| |
| DataType GetFront(); |
| DataType GetRear(); |
| |
| Node * BuyNode(DataType X); |
| }; |
初始化:(创建空队)
把 Front
和 Rear
指向空。
| void QueueLinked::Init() { |
| Front = Rear = nullptr; |
| } |
判空
当 Front
指向空时,即队列为空
| bool QueueLinked::IsEmpty() { |
| return Front == nullptr; |
| } |
创建节点
把数据 X
传到 BuyNode()
方法中,用 malloc()
函数动态分配一个节点:
| Node * QueueLinked::BuyNode(DataType X) { |
| Node * NewNode = (Node *)malloc(sizeof(Node)); |
| |
| |
| if (NewNode == nullptr) { |
| cout << "Malloc Failed!" << endl; |
| exit(-1); |
| } |
| else { |
| NewNode->A = X; |
| NewNode->Next = nullptr; |
| } |
| |
| return NewNode; |
| } |
入队:
- 若队为空,则创建新节点
NewNode
,把 NewNode
同时赋值给 Front
与 Rear
- 若队非空,则把
NewNode
接在 Rear
指针之后,即 Rear->Next = NewNode
| void QueueLinked::Push(DataType X) { |
| if (IsEmpty()) { |
| Node * NewNode = BuyNode(X); |
| Front = Rear = NewNode; |
| } |
| else { |
| Node * NewNode = BuyNode(X); |
| Rear->Next = NewNode; |
| Rear = Rear->Next; |
| } |
| } |
出队
- 若队为空:报错
- 若队非空:操作
Front
指针,进行出队操作
- 用临时变量
Tmp
保存当前 Front
指针所指向的位置;
- 把
Front
指针向后移动一位 Front = Front->Next
;
- 释放
Tmp
,并将其置空
| void QueueLinked::Pop() { |
| if (IsEmpty()) { |
| cout << "Queue Is Empty!" << endl; |
| exit(-1); |
| } |
| else { |
| Node * Tmp = Front; |
| Front = Front->Next; |
| free(Tmp); |
| Tmp = nullptr; |
| } |
| } |
获取队头、队尾元素
直接返回 Front
和 Rear
的数据域即可,若表为空,则不可获取。
| DataType QueueLinked::GetFront() { |
| if (IsEmpty()) { |
| cout << "Queue Is Empty!" << endl; |
| exit(-1); |
| } |
| return Front->A; |
| } |
| DataType QueueLinked::GetRear() { |
| if (IsEmpty()) { |
| cout << "Queue Is Empty!" << endl; |
| exit(-1); |
| } |
| return Rear->A; |
| } |
摧毁队列
只要队列不为空,即 IsEmpty()
为假时,就一直出队,直到队空为止。
| void QueueLinked::MakeEmpty() { |
| while (!IsEmpty()) { |
| Pop(); |
| } |
| } |
踩坑记录
报错:
| warning: HEAP[a.exe]: |
| warning: Heap block at 0000000000A93BA0 modified at 0000000000A93BB8 past requested size of 4 |
| |
| Thread 1 received signal SIGTRAP, Trace/breakpoint trap. |
| 0x00007ffe6fb8a503 in ntdll!RtlRegisterSecureMemoryCacheCallback () from C:\Windows\SYSTEM32\ntdll.dll |
原因:
在动态内存分配时,都将 DataType
类型大小分配给了 Node
类型的指针,导致的错误。
| Node * NewNode = (Node *)malloc(sizeof(DataType)); |
修正
| Node * NewNode = (Node *)malloc(sizeof(Node)); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构