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

链表中新节点添加后不显示的原因及指针传参疑问

链表添加节点不显示问题及指针传递疑问

问题描述

以下是一个链表实现的代码:

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:45:35