You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++循环单链表尾部添加节点及打印功能调试求助

问题分析与修复方案

核心问题

  1. addLast函数无限循环:当添加第二个节点后,链表形成循环结构,但代码中判断尾节点的条件是curr->next != NULL,而循环链表中没有节点的next为NULL,导致while循环无限执行,程序卡死,无法输出任何内容。
  2. 循环链表初始化错误:第一个节点创建时,tmp->next = head(此时head为NULL),导致第一个节点的next指向NULL,没有形成循环结构,违背设计初衷。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:05:17