循环链表队列LinkedQueueType无法入队,测试无输出求技术支援
问题排查与修复方案
首先,你的代码存在几个关键问题,直接导致了程序崩溃(这也是cout<<"hi"可能没输出的原因——如果没加endl或flush,输出会留在缓冲区,程序崩溃后就无法打印出来):
1. 空指针解引用(最致命的错误)
在Enqueue函数里,你先把newNode初始化为nullptr,然后直接尝试访问newNode->info和newNode->next——这属于未定义行为,会直接触发程序崩溃。你需要先为newNode分配内存空间:
NodeType *newNode = new NodeType; // 替换原有的 nullptr 初始化
2. 构造函数未实现,成员变量未初始化
你的LinkedQueueType类仅声明了构造函数,但没有提供具体实现。这会导致创建队列对象时,rear指针和length变量是随机的垃圾值,而非预期的nullptr和0。必须实现构造函数来初始化这些成员:
LinkedQueueType::LinkedQueueType() { rear = nullptr; length = 0; }
3. 循环链表队列的逻辑错误
当前的Enqueue逻辑没有正确维护循环链表的结构。循环队列的rear应指向队列的最后一个节点,且rear->next要指向队列的第一个节点(形成闭环)。正确的Enqueue实现应该是:
void LinkedQueueType::Enqueue(ItemType newItem) { NodeType *newNode = new NodeType; newNode->info = newItem; if (IsEmpty()) { // 队列为空时,新节点自身形成循环 newNode->next = newNode; rear = newNode; } else { // 新节点的next指向队头(rear的下一个节点) newNode->next = rear->next; // 原队尾的next指向新节点 rear->next = newNode; // 更新rear为新的队尾 rear = newNode; } length++; // 别忘了更新队列长度 }
额外的必要修复
- 实现
IsEmpty函数,否则判断队列是否为空的逻辑会失效:
bool LinkedQueueType::IsEmpty() const { return rear == nullptr; }
- 链表实现的队列不存在“满”的情况(除非内存耗尽),所以
IsFull函数可以直接返回false:
bool LinkedQueueType::IsFull() const { return false; }
测试代码的小调整
为了确保cout<<"hi"能及时输出,建议加上endl刷新缓冲区:
cout<<"hi"<<endl; LinkedQueueType q; q.Enqueue(5);
完成以上所有修复后,你的队列应该就能正常执行Enqueue操作了。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

