C++链表代码运行后无输出,请求排查解决
问题分析与修复
你的代码运行无输出的核心问题是尾插函数insertatend中,新创建的节点next指针未初始化为NULL,导致链表遍历触发未定义行为(比如无限循环或访问非法内存,程序直接崩溃),终端无法正常输出内容。
具体问题点
- 尾插节点未终止链表:用
malloc分配内存时不会自动初始化成员变量,新节点的next是随机垃圾值而非NULL。遍历链表到最后一个节点时,p->next不为空,printlist的while循环会持续访问非法内存,程序崩溃无法完成输出。 - 可选优化:C++规范问题:
malloc是C语言内存分配方式,C++中更推荐用new,虽不影响功能,但更符合语言规范。
修复后的代码
#include <iostream> #include <string> using namespace std; struct node { int data; struct node *next; }; struct node *head = NULL; // 打印链表 void printlist(){ struct node *p = head; cout << "\n["; while(p != NULL) { cout << " " << p->data << " "; p = p->next; } cout << "]" << endl; // 强制刷新输出缓冲区 } // 头插节点 void insertatbegin(int data){ struct node *lk = new node; // 替换malloc为new lk->data = data; lk->next = head; head = lk; } // 尾插节点 void insertatend(int data){ struct node *lk = new node; lk->data = data; lk->next = NULL; // 关键:设置新节点next为NULL,终止链表 struct node *linkedlist = head; // 边界处理:链表为空时直接将head指向新节点 if (linkedlist == NULL) { head = lk; return; } while(linkedlist->next != NULL) { linkedlist = linkedlist->next; } linkedlist->next = lk; } int main(){ insertatbegin(12); insertatend(22); insertatend(30); insertatend(44); insertatend(50); cout << "Linked List: "; printlist(); return 0; }
修复说明
- 给尾插的新节点添加
lk->next = NULL,确保链表末尾正确终止,遍历能正常结束。 - 增加链表为空时尾插的边界处理,让代码更健壮。
- 用
new替代malloc,符合C++编程习惯。 - 在
printlist末尾加endl,强制刷新输出缓冲区,确保内容及时打印到终端。
运行修复后的代码,即可得到预期输出:
Linked List: [ 12 22 30 44 50 ]
内容的提问来源于stack exchange,提问作者WIKI WIKI
相关产品推荐
相关产品推荐

