数组实现5个Linked List Queue打印队列,代码无法添加任务求排查
你的打印队列代码问题分析与修复
让我帮你排查下这段代码的问题,几个关键错误导致你没法正常向队列添加打印任务:
核心问题清单
参数传递与返回类型不匹配:
你调用insertNodes(i, num)时,第一个参数传的是整数i,但insertNodes函数的第一个参数要求是node*类型的头指针,这直接导致类型错误;另外函数定义的返回类型是int,但你实际需要返回更新后的链表头指针node*,类型不匹配会丢失头节点地址,后续根本找不到队列的入口。链表插入逻辑致命错误:
在else分支里,你写了Ptr->next = Ptr;,这会把当前遍历到的节点的next指向自己,形成循环链表,完全没有把新创建的aNode添加到链表末尾,正确的写法应该是Ptr->next = aNode;。冗余全局变量与未初始化数组:
你定义的全局head变量完全多余,每个队列的头节点应该由数组A的元素来维护;另外数组A声明后没有初始化每个元素为NULL,初始时都是野指针,会导致判断队列是否为空的逻辑失效。
修正后的完整代码
#include "stdafx.h" #include <iostream> using namespace std; struct node { float value; struct node *next; }; // 每个队列的头指针数组,初始化每个元素为NULL node* A[5] = {NULL}; // 修正返回类型为node*,参数为对应队列的头指针和要插入的值 node* insertNodes(node *head, int value) { node *aNode, *Ptr; aNode = new node; aNode->value = value; aNode->next = NULL; if (head == NULL) { head = aNode; } else { Ptr = head; while (Ptr->next != NULL) { Ptr = Ptr->next; } // 将新节点挂到链表末尾,而不是形成循环 Ptr->next = aNode; } return head; } int _tmain(int argc, _TCHAR* argv[]) { int num; for (int i = 0; i < 5; i++) { cout << "Insert number for queue " << i << ": "; cin >> num; // 传入对应队列的当前头指针,接收返回的新头指针 A[i] = insertNodes(A[i], num); } // 可选:测试打印每个队列的内容,验证是否插入成功 cout << "\nAll queues content:\n"; for (int i = 0; i < 5; i++) { cout << "Queue " << i << ": "; node* temp = A[i]; while (temp != NULL) { cout << temp->value << " "; temp = temp->next; } cout << endl; } return 0; }
修正说明
- 初始化数组
A的每个元素为NULL,确保每个队列初始为空; - 修正
insertNodes的返回类型为node*,并且调用时传入对应队列的当前头指针A[i],用返回值更新该队列的头指针; - 修复链表插入的逻辑,把新节点正确挂到链表末尾;
- 移除了冗余的全局
head变量,让数组A的每个元素独立维护对应队列的头节点; - 增加了测试打印逻辑,方便你验证每个队列的内容是否正确插入。
内容的提问来源于stack exchange,提问作者user9327397
相关产品推荐
相关产品推荐

