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

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;
}

修复说明

  1. 将初始head设为NULL,表示链表初始为空,避免空节点干扰。
  2. 删除addEnd和display中多余的new node操作,直接用指针指向现有节点。
  3. 修改display的循环条件为curr != NULL,确保所有节点都能被遍历输出。
  4. 在addEnd中增加空链表判断,当链表为空时直接将head设为新节点。

修改后执行测试代码,就能得到你期望的输出:

Element 1: 1
Element 2: 2
Element 3: 3
Element 4: 4

内容的提问来源于stack exchange,提问作者Jesay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:13:15