调用insertNodeToEnd与displayNode后无输出,链表代码问题排查
单链表插入节点后无输出的问题排查
你的代码核心问题出在insertNodeToEnd函数的实现上,直接访问空指针成员导致程序触发未定义行为(大概率是提前崩溃,所以没机会执行到displayNode的输出逻辑)。具体问题和修复方案如下:
1. 致命错误:空指针解引用
当遍历到链表尾部时,curr->next的值是NULL,你直接执行curr->next->data = data,这属于对空指针的非法解引用,会直接导致程序异常终止,自然看不到任何输出。
2. 逻辑错误:未创建新节点
向链表尾部插入节点的正确逻辑是先创建一个新的Node对象,再将其挂载到链表尾部,而不是直接给空指针的成员赋值。
修复后的完整代码
#include <iostream> using namespace std; struct Node{ int data; Node* next; }; void displayNode(Node* head ){ while(head!=NULL){ cout<<head->data<<endl; head = head->next; } } // 修复后的尾部插入函数 void insertNodeToEnd(Node* curr , int data){ while(curr->next != NULL){ curr = curr->next; } // 1. 先创建新节点并初始化 Node* newNode = new Node; newNode->data = data; newNode->next = NULL; // 2. 将新节点挂载到链表尾部 curr->next = newNode; } int main(){ Node* Head = new Node; Head->next = NULL; Head->data = 500; Node *iter = Head; for(int i = 0 ; i<5 ; i++){ insertNodeToEnd(iter,i*10); } displayNode(Head); // 额外提醒:实际开发中要记得遍历链表释放内存,避免内存泄漏 return 0; }
额外优化点
- 你定义的全局变量
Node* head;没有被使用,可以直接删除,避免冗余。 - 循环中
iter始终指向链表头,直接传Head给insertNodeToEnd函数效果完全一致,不需要额外定义iter变量。
内容的提问来源于stack exchange,提问作者Mehmet ÖNAL
相关产品推荐
相关产品推荐

