C++循环单链表尾部添加节点及打印功能调试求助
问题分析与修复方案
核心问题
- addLast函数无限循环:当添加第二个节点后,链表形成循环结构,但代码中判断尾节点的条件是
curr->next != NULL,而循环链表中没有节点的next为NULL,导致while循环无限执行,程序卡死,无法输出任何内容。 - 循环链表初始化错误:第一个节点创建时,
tmp->next = head(此时head为NULL),导致第一个节点的next指向NULL,没有形成循环结构,违背设计初衷。 - display函数逻辑失效:固定循环5次且未移动指针,只会重复输出头节点数据,无法遍历整个链表;同时未刷新输出缓冲区,即使程序正常运行,输出也可能滞留。
修复后的完整代码
using namespace std; class Node { public: int data; Node* next; Node(int x) { data = x; next = nullptr; } }; class Lfun { public: virtual void addLast(int x) = 0; virtual void display() = 0; virtual ~Lfun(){}; }; class List :public Lfun{ private: Node* head; public: List() { head = nullptr; } void addLast(int x) { Node *tmp = new Node(x); if (head == nullptr) { head = tmp; tmp->next = head; // 第一个节点自指,初始化循环链表 } else { Node* curr = head; // 找到尾节点(next指向head的节点) while (curr->next != head) { curr = curr->next; } curr->next = tmp; tmp->next = head; // 新节点指向头,维持循环 } } void display() { if (head == nullptr) return; Node* curr = head; do { cout << curr->data << " "; curr = curr->next; } while (curr != head); // 遍历至回到头节点结束 cout << endl; } }; int main() { List* ll = new List(); for (int i = 0; i < 5; i++) { cout << "添加节点" << i << "后:"; ll->addLast(i); ll->display(); } // 释放内存,避免泄漏 if (ll != nullptr) { if (ll->head != nullptr) { Node* curr = ll->head->next; while (curr != ll->head) { Node* tmp = curr; curr = curr->next; delete tmp; } delete ll->head; } delete ll; } return 0; }
关键修改说明
- 修正循环链表尾节点判断:将
while (curr->next != NULL)改为while (curr->next != head),精准定位循环链表的尾节点,避免无限循环。 - 正确初始化循环链表:第一个节点创建时设置
tmp->next = head(此时head已指向该节点),确保链表从初始就形成循环结构。 - 修复遍历逻辑:使用
do-while循环遍历循环链表,确保所有节点都被输出;添加endl刷新输出缓冲区,保证内容及时显示。 - 移除全局curr变量:改用局部变量存储遍历指针,避免不同函数操作同一变量引发的逻辑冲突。
- 添加内存释放:手动释放链表节点和List对象,避免内存泄漏。
- 使用nullptr替代NULL:符合现代C++语法规范。
内容的提问来源于stack exchange,提问作者ItsRibhav
相关产品推荐
相关产品推荐

