【发布时间】:2020-10-19 23:42:41
【问题描述】:
所以使用下面的push 函数(插入到列表的开头)。我知道它首先为一个名为new_node 的节点分配内存,然后你给它分配x = 5 之类的值,然后将head 设置为指向new_node。
void push(int x, struct Node** head_ref) {
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
new_node->data = x; //New data
new_node->next = (*head_ref); //Connects the new_node to what beginning of the node
(*head_ref) = new_node; //The head now points to the new node
}
我无法理解new_node 到底发生了什么?当我在函数运行后运行函数n 次数时,我能够毫无问题地遍历列表,并且能够打印新节点的值,但不会有问题是因为我们每次运行函数时都使用相同的变量名new_node?它是否与计算机如何使用分配的内存有关,或者可能是其他原因?我找不到很多关于我的主题的信息来回答我的问题。
【问题讨论】:
-
纸、铅笔、盒子和箭头。听起来微不足道,但您会惊讶于它们在破译动态数据结构(如链表)方面的帮助程度。
-
这是一个短暂的局部变量。就像在一张纸上写了一个值,在这种情况下,该值是一块分配的内存的唯一地址,用于保存新节点。稍后,当您希望列表的头部指向该内存时,您可以从纸上检索地址并将其值(通过
(*head_ref) = new_node)存储在可以检索列表头部的位置。然后你丢弃那张纸。下一次,你有一张新纸要写。 -
new_node是(只是)一个指针,而不是节点本身。您需要了解指针与其指向的对象之间的区别。 -
@jarmod 所以告诉我我是否正确。所以一旦我运行我的函数,它就会给我的新节点一个内存位置,然后给它你传递给它的任何值,然后让
head指向内存中的那个位置,并使new_node指向下一个节点,因为它是分配它不会从内存中消失,然后下次我运行该函数时,它会创建一个新的内存地址,依此类推。对吗? -
基本上,是的。它为新节点分配内存,填充其数据值,然后将其挂接到现有链表中(首先使其
next指针指向当前位于链表头部的节点,然后将头指向它,新节点)。喜欢youtube.com/watch?v=dU0KxLgNM9E
标签: c data-structures linked-list