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

链表打印异常求助:仅输出首个节点数据,疑print函数实现有误

问题分析与修复方案

嘿,我一眼就揪出你代码里的问题了——你的print()函数在遍历链表时直接修改了节点的link成员变量,这不仅导致只输出第一个元素,还直接破坏了整个链表的结构!

具体问题拆解

咱们跟着代码执行流程走一遍你遇到的坑:

  1. 你构建的链表是:Head指向存data1的节点,这个节点的link指向存data2的节点,data2节点的link为NULL。
  2. 调用Head->print()时:
    • 第一次判断!isEnd():当前节点(data1节点)的link不为NULL,条件成立,输出data1。
    • 然后执行link = link->link:这直接把Head节点的link改成了data2节点的link(也就是NULL)!
    • 循环再次检查!isEnd():此时Head的link已经是NULL,isEnd()返回true,循环直接终止,自然不会输出data2。
    • 更糟的是,现在你的链表结构已经被破坏,Head再也找不到data2节点了。

修复后的代码

核心原则是:用临时指针遍历链表,绝对不能修改原节点的link成员。修改后的print()函数如下:

void print() {
    node* current = this; // 用临时指针遍历,不改动原链表结构
    while (current != NULL) { // 遍历到空指针为止
        std::cout << current->data << std::endl;
        current = current->link; // 移动到下一个节点
    }
}

顺带提一句,你的isEnd()函数其实可以简化成一行return link == NULL;,不过用临时指针遍历时,直接判断当前指针是否为NULL会更直观,不需要依赖isEnd()。

额外小提示

  • 记得在代码开头包含<iostream>头文件,如果你没写using namespace std;,就别把std::endl写成endl,否则会编译报错。
  • 链表使用完毕后记得手动释放内存,避免内存泄漏哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:27:28