在C语言中,在链表中插入一个新节点究竟是如何工作的?

在C语言中,在链表中插入一个新节点究竟是如何工作的?,c,data-structures,linked-list,C,Data Structures,Linked List,因此,使用下面的push功能(在列表开头插入)。我知道它首先为名为new\u node的节点分配内存,然后你给它赋值,比如x=5,然后将头设置为指向new\u node void push(int x,结构节点**head\u ref){ 结构节点*新节点=(结构节点*)malloc(sizeof(结构节点)); 新建节点->数据=x;//新建数据 新建节点->下一步=(*head\u ref);//将新节点连接到节点的起始位置 (*head\u ref)=新节点;//头部现在指向新节点 }

因此,使用下面的
push
功能(在列表开头插入)。我知道它首先为名为
new\u node
的节点分配内存,然后你给它赋值,比如
x=5
,然后将
头设置为指向
new\u node

void push(int x,结构节点**head\u ref){
结构节点*新节点=(结构节点*)malloc(sizeof(结构节点));
新建节点->数据=x;//新建数据
新建节点->下一步=(*head\u ref);//将新节点连接到节点的起始位置
(*head\u ref)=新节点;//头部现在指向新节点
}
我无法理解的是
new\u node
到底发生了什么?当我在函数运行后多次运行函数时,我能够毫无问题地遍历列表,并且能够打印新节点的值,但是由于每次运行函数时都使用相同的变量名
new\u node
,这难道不会有问题吗?它是否与计算机如何使用分配的内存有关,或者可能是其他原因?我找不到太多关于我的主题的信息来回答我的问题

但是,如果每次运行函数时都使用相同的变量名new_node,那么会不会出现问题

没有;变量在函数作用域上声明和定义。换句话说,每次运行函数时,它都是一个新变量。如果执行以下简单功能:

int-aNumber(){
int x=4;
return++x;
}

然后该函数每次返回5,因为
x
是在函数内部声明和定义的,因此只在函数运行时存在。

纸、铅笔、方框和箭头。听起来很简单,但你会惊讶于它们在破译动态数据结构(如链表)方面的作用是多么的清晰。链表是一个短暂的局部变量。就像在一张纸上写一个值,在这种情况下,该值是一块分配内存的唯一地址,用于保存新节点。稍后,当您希望列表的标题指向该内存时,您可以从纸张中检索地址,并将其值(通过
(*head\u ref)=new\u node
)存储在可以检索列表标题的位置。然后你扔掉那张纸。下次,你会有一张新的纸要写。
new\u node
只是一个指针,而不是节点本身。你需要理解指针和它指向的东西之间的区别。@jarmod所以告诉我我是否正确。因此,一旦我运行我的函数,它会给我的新节点一个内存中的位置,然后给它你传递给它的任何值,然后让
head
指向内存中的那个位置,让
new_node
指向下一个节点,因为它被分配了,所以它不会从内存中消失,下次我运行函数时,它将生成一个新的内存地址,等等。对吧?基本上是的。它为新节点分配内存,填充其数据值,然后将其挂接到现有链表中(首先使其
next
指针指向当前位于列表顶部的节点,然后将其头部指向新节点)。喜欢