我正在学习链接列表,而我阅读的文章则展示了如何创建链接列表并将其添加到列表的前面。以下是他们所说的方式:
1)分配:在堆中分配新节点并将其
.data
设置为 无论需要存储什么。struct node* newNode; newNode = malloc(sizeof(struct node)); newNode->data = data_client_wants_stored;
2) Link Next :设置新节点的
.next
指针指向当前 列表的第一个节点。这实际上只是一个指针赋值 - 记住:"将一个指针指向另一个指针使它们指向相同的指针 。东西"newNode->next = head;
3)链接头:将头指针更改为指向新节点,所以它是 现在是列表中的第一个节点。
head = newNode;
以下是我对此过程的理解:
当我们将next
指针指向head,然后将head
指定给newNode
时,与将next
设置为{{1}的情况相同}}?因为第二步说分配给一个指针使它们指向同一个东西。当我们重新指定newNode
指向head
时,是否也会更改newNode
?
答案 0 :(得分:4)
当我们重新分配指向newNode的时候,那不会改变newNode->下一步吗?
幸运的是,答案是否定的。让我们以一些简单的int
变量为例:
int a = 42;
int b = 15;
b = a;
a = 0; // <-- Here
我们设置a = 0
后,b
的值仍为42,这是在上一行中设置的。原因是在上一行中撰写a = b
并未永久链接a
和b
的值;相反,它是“将b
的值更改为a
的值的一次性操作。”
作为平行,在这些方面:
newNode->next = head;
head = newNode;
第一行newNode->next = head;
表示“在此时刻将newNode->next
的值更改为head
的值。”因此,newNode
的{{1}}指针将指向链表的开头。然后,当您执行next
时,会更新head = newNode;
的值,使其现在指向head
。我们在上一行中设置newNode
的事实不会导致newNode->next = head
重新布线以指向newNode->next
本身,就像写newNode
一样a = 0
示例未更改int
的值。
希望这有帮助!