C++链表尾端添加节点异常:输出不符合预期求解决
C++链表尾插异常问题修复
你的链表代码存在几个关键问题,导致输出不符合预期,以下是具体问题和修复方案:
问题1:初始头节点的错误初始化
Linkedlist类中,私有成员head被直接初始化为new node,但这个节点的data未赋值,构造函数仅设置了head->next = NULL。这会让链表从一开始就存在一个未初始化数据的空节点,后续插入和遍历都会受其干扰。
问题2:不必要的节点内存分配
在addEnd和display函数中,你错误地为curr指针执行new node操作,随后立刻将其赋值为head。这不仅会造成内存泄漏,完全是多余操作——直接用指针指向head即可,无需额外分配内存。
问题3:遍历循环条件错误
display函数的循环条件是while(curr->next != NULL),这会导致最后一个节点无法被打印。当curr指向最后一个节点时,curr->next已经是NULL,循环直接终止,跳过了最后一个节点的输出。
问题4:头插逻辑与初始节点冲突
addStart函数将新节点插在head前面,但初始head是个空节点,插入后的链表结构会变成新节点 -> 空节点 -> ...,遍历时空节点的垃圾数据会被输出。
修复后的完整代码
#include <iostream> #define tab '\t' using std::cout; using std::endl; struct node { int data; node* next; }; class Linkedlist { private: // 初始头节点设为NULL,表示空链表 node* head = NULL; public: Linkedlist(){} void addStart(int val){ node* temp = new node; temp->data = val; temp->next = head; head = temp; } void addEnd(int val){ node* temp = new node; temp->data = val; temp->next = NULL; // 直接用curr指向head,无需new node* curr = head; // 链表为空时,直接将head设为新节点 if (curr == NULL) { head = temp; return; } while(curr->next != NULL){ curr = curr->next; } curr->next = temp; } void display(){ if (head == NULL){ cout << endl << "Linked List is EMPTY."; } else { int i = 1; // 直接指向head,无需new node* curr = head; cout << endl << "The linked list contains..." << endl; // 循环条件改为curr != NULL,遍历所有节点 while(curr != NULL){ cout << "Element " << i << ':' << tab << curr->data << endl; curr = curr->next; i++; } } } }; // 测试示例 int main() { Linkedlist list; list.addEnd(1); list.addEnd(2); list.addEnd(3); list.addEnd(4); list.display(); return 0; }
修复说明
- 将初始
head设为NULL,表示链表初始为空,避免空节点干扰。 - 删除
addEnd和display中多余的new node操作,直接用指针指向现有节点。 - 修改
display的循环条件为curr != NULL,确保所有节点都能被遍历输出。 - 在
addEnd中增加空链表判断,当链表为空时直接将head设为新节点。
修改后执行测试代码,就能得到你期望的输出:
Element 1: 1
Element 2: 2
Element 3: 3
Element 4: 4
内容的提问来源于stack exchange,提问作者Jesay
相关产品推荐
相关产品推荐

