链表中新节点添加后不显示的原因及指针传参疑问
问题描述
以下是一个链表实现的代码:
#include <iostream> using namespace std; class Node { public: int value; Node* next; }; // 此函数用于打印每个节点的值 void printValues(Node *p) { int i = 1; while(p !=NULL) { cout << "This is the " << i << " th time " << p->value << "\n\n"; p = p->next; i++; } } void addNode (Node *p, int newValue) { Node *newNode = new Node(); newNode -> value = newValue; newNode -> next = p; p = newNode; } int main() { Node *head = new Node(); Node *second = new Node(); Node *third = new Node(); Node *fourth = new Node(); Node* fifth = new Node(); head -> value = 25; head ->next = second; second-> value = 5; second->next = third; third ->value = 35; third -> next = fourth; fourth ->value = 5; fourth ->next = fifth; fifth -> value = 18; fifth ->next = NULL; printValues(head); addNode(head, 32000); printValues(head); return 0; }
该代码包含打印节点值和在现有节点前添加新节点的基础功能。
我的问题是:为何新节点添加后无法显示?调用printValues打印时看不到新增节点,不确定是未添加成功还是打印逻辑有问题。
我编写了addNode函数,接收main函数中的head指针和新节点值,已在函数内为新节点分配内存。尝试用引用带出newNode但提示其在main函数中不存在,认为是作用域问题。
改用二级指针**p后功能正常,但我的疑问是:head本身已存储地址,为何需要以引用方式传递head,或是使用二级指针?直接传递head不行吗?
问题解答
1. 新节点无法显示的核心原因
你当前的addNode函数采用的是指针的值传递——函数参数Node *p是main中head指针的一个副本,而非head本身。当你在函数内执行p = newNode时,只是修改了这个副本的指向,main函数里的原始head指针完全没变化。所以调用printValues(head)时,依然指向原来的链表头节点,自然看不到新增的节点。
2. 为什么需要引用或二级指针?
head是一个指针变量,它的作用是存储链表头节点的内存地址。如果想在函数里修改head自己的指向(比如让它指向新创建的头节点),必须让函数能直接操作head这个变量本身:
- 二级指针:
Node **p接收的是head变量的内存地址,函数内通过*p = newNode就能直接修改main中head的指向。 - 指针引用:
Node *&p直接绑定main里的head变量,函数内修改p就等同于修改原始的head。
直接传递head(值传递)的情况下,函数只能操作head指向的节点内容,无法改变head自身的指向——因为你拿到的只是个副本,副本的修改不会同步到原变量。
修复后的addNode函数示例
用指针引用修改后的版本:
void addNode(Node *&p, int newValue) { Node *newNode = new Node(); newNode->value = newValue; newNode->next = p; p = newNode; }
此时调用addNode(head, 32000),main中的head会直接被更新为新节点的地址,再次打印就能看到新增的节点了。
内容的提问来源于stack exchange,提问作者Niranjan Gaire

