为什么这个代码没有预先添加到链表创建一个循环?

时间:2014-08-27 23:47:40

标签: c pointers linked-list

我正在学习链接列表,而我阅读的文章则展示了如何创建链接列表并将其添加到列表的前面。以下是他们所说的方式:

  

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

1 个答案:

答案 0 :(得分:4)

  

当我们重新分配指向newNode的时候,那不会改变newNode->下一步吗?

幸运的是,答案是否定的。让我们以一些简单的int变量为例:

int a = 42;
int b = 15;
b = a;
a = 0; // <-- Here

我们设置a = 0后,b的值仍为42,这是在上一行中设置的。原因是在上一行中撰写a = b并未永久链接ab的值;相反,它是“将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的值。

希望这有帮助!