为什么我编写的C++链表程序运行后没有任何输出?
问题原因分析
核心问题是addFront函数的头节点参数采用了值传递,修改的仅为函数内的局部变量,全局头指针从未被正确更新:
- 你定义的全局变量
Node *head默认初始化为NULL,调用addFront时,空指针按值传入函数,函数内部的head参数只是全局head的临时副本。 - 函数末尾执行
head = temp;仅修改了局部副本的值,全局head变量全程都保持为NULL,没有任何变化。 - 后续调用
traverse(head)时,传入的是仍然为NULL的全局头指针,循环判断temp!=NULL直接不成立,因此不会有任何输出。
修复方案
有两种常用的修复方式可选:
方式1:修改addFront参数为指针的引用(C++特性)
使用*&表示传入指针的引用,函数内对head的修改会直接作用到外部传入的原指针上:
// 仅修改函数定义的参数部分即可 void addFront(Node *&head, int item) { Node *temp = new Node(); temp->data = item; temp->next = head; head = temp; }
方式2:传入头指针的二级指针
如果不想使用引用特性,也可以传入头指针的地址,通过二级指针修改原头指针的值:
// 修改函数定义为二级指针参数 void addFront(Node **head, int item) { Node *temp = new Node(); temp->data = item; temp->next = *head; *head = temp; } // main函数内的调用同步修改为传入头指针的地址 int main() { addFront(&head, 1); addFront(&head, 2); addFront(&head, 3); traverse(head); }
补充说明
建议全局头指针显式初始化Node *head = NULL;,避免不同编译器下的默认初始化异常。修复后代码运行会输出3 2 1,符合头插法的顺序逻辑。
内容的提问来源于stack exchange,提问作者Gaurav Singh
相关产品推荐
相关产品推荐

