C++链表程序无法输出预期0 1 2 3 4 5序列 排查修复代码错误
问题分析
代码存在3处问题,导致无法输出预期结果:
- 核心逻辑错误:
insert函数的头指针参数为值传递,函数内的head是外部传入指针的临时拷贝,第一次插入节点时对head的赋值仅作用于临时变量,函数执行结束后临时变量销毁,main函数中的head1始终是初始值nullptr,完全没有构建出有效链表结构。 - 输出逻辑错误:
display函数中每个数值输出后都拼接了endl强制换行,即使链表正常构建,输出结果也会是每个数字单独占一行,无法得到空格分隔的连续序列。 - 冗余依赖:代码中引入的
<fstream>头文件全程未被使用,可以直接删除。
修复方案
针对值传递的问题,有两种标准修复写法,选择其中一种即可:
写法1:使用指针引用传参(C++推荐写法)
将insert函数的形参改为头指针的引用,不需要修改原有调用代码,即可让函数内对头指针的修改直接作用到外部变量:
void insert(Item *&head, int value) { Item *newnode = new Item; newnode->val = value; newnode->next = nullptr; if (!head) { head = newnode; } else { Item *temp = head; while (temp->next != nullptr) temp = temp->next; temp->next = newnode; } }
写法2:使用二级指针传参
将insert函数的形参改为指向头指针的二级指针,传入头指针的内存地址,函数内通过解引用操作修改外部头指针的值,需要同步修改调用处的传参逻辑:
// 函数定义修改 void insert(Item **head, int value) { Item *newnode = new Item; newnode->val = value; newnode->next = nullptr; if (!*head) { *head = newnode; } else { Item *temp = *head; while (temp->next != nullptr) temp = temp->next; temp->next = newnode; } } // main函数中调用修改为传地址 for(int k = 0; k < 6; k++) insert(&head1, k);
同时修改display函数的输出逻辑,遍历过程中仅输出数值和间隔空格,所有节点遍历完成后再换行:
void display(Item *head) { Item *temp = head; while (temp) { cout << temp->val << " "; temp = temp->next; } cout << endl; }
修复后完整可运行代码
#include <iostream> using namespace std; struct Item { int val; Item* next; }; void insert(Item *&head, int value) { Item *newnode = new Item; newnode->val = value; newnode->next = nullptr; if (!head) { head = newnode; } else { Item *temp = head; while (temp->next != nullptr) temp = temp->next; temp->next = newnode; } } void display(Item *head) { Item *temp = head; while (temp) { cout << temp->val << " "; temp = temp->next; } cout << endl; } int main() { Item *head1 = nullptr; for(int k = 0; k < 6; k++) insert(head1, k); display(head1); // 提示:生产环境使用需要遍历释放链表节点内存,避免内存泄漏 return 0; }
编译运行后输出结果为
0 1 2 3 4 5,与预期一致。如果介意末尾多余的空格,可以在输出时增加判断,单独处理第一个或最后一个节点的输出格式即可。
内容的提问来源于stack exchange,提问作者wise john
相关产品推荐
相关产品推荐

