与C中的链表略有混淆

时间:2010-11-11 11:42:52

标签: c linked-list

我正在阅读linked lists and their implementation in C on Wikipedia。我没有像其他C概念那样快速地接受它们。

list_add()函数中,我想知道它为什么说......

n->next = *p; /* the previous element (*p) now becomes the "next" element */

我真的不明白这个评论。为什么前面的元素会成为下一个?新节点不应该成为旧节点上的下一个节点吗?

请记住,我刚开始查看链接列表,请慢慢地浏览一下。

感谢。

更新

很抱歉,如果不是很明显,但我正在查看的所有代码都在Wikipedia article上。

9 个答案:

答案 0 :(得分:7)

因为列表是单链接的,意味着它是A->B->C->etc,所以它必须遍历整个列表以在最后添加新元素。

相反,它会在开头添加新元素n,并将n->next指向前一个元素p

答案 1 :(得分:5)

在最简单的链表实现中,新节点被添加到列表的前面,因为它更容易。您只需要指向列表第一个节点的单个指针,而不必搜索列表以查找结尾。更复杂的实现可能会保留前端指针和结束指针,以便添加到列表的任一端。

答案 2 :(得分:2)

这是因为该方法将新节点添加到列表的 start ,即新创建的节点成为列表中的新第一个节点。

在列表开头添加新节点的一般方法:

// allocate new node pointed by new_node and fill it.

// make new node the first node by making it's next point to current head.
new_node->next = head; 

// head should always point to the beginning of the list.
head = new_node; 

答案 3 :(得分:2)

list_add函数不一定在列表的开头添加一个新节点 - 它只是添加一个位于p之前的新节点。

参数p可以间接指向列表开头的节点或列表中的任何其他节点。

然后,此代码创建一个新节点,将next字段设置为p指向的任何字段。

<强>更新

此代码使用指向指针到节点的指针技巧,在处理链接列表时非常有用。如果您是第一次看到链接列表,这可能会令人困惑。但你应该花时间去理解它,因为它是指针功能的一个很好的例子。

在代码中,p指向一个指针,然后指针指向一个节点。这意味着p可以间接指向列表中的第一个节点:

pointer to pointer usage in a linked list

...这意味着add_node将在列表的开头插入一个新节点。但p也可以间接指向列表中的其他节点:

more pointer to pointer usage

在第二个示例中,add_node将在列表中的第一个和第二个节点之间插入一个新节点。

答案 4 :(得分:1)

新节点将附加到现有列表的开头。

[0] [1] [2] + [n]  = [n] [0] [1] [2]

答案 5 :(得分:1)

list_add函数将一个元素追加到列表的开头。所以这个评论意味着我们的新元素(n)必须指向列表的旧头(p):

[p]->[1]->[2] + [n] ==> [n]->[p]->[1]->[2]

如果我们要在列表的末尾添加一个元素,那么新节点应该是旧节点的下一个节点:

[0]->[1]->[p] + [n] ==> [0]->[1]->[p]->[n]

答案 6 :(得分:1)

函数list_add获取p,它是指向链接的指针(也是指针),指向我们需要插入新数据的元素。 n是新分配的节点,因此n->next = *p;基本上表示“新节点的下一个链接设置为指向*p指向的节点”。

... [data, next]    >[data, next]   > >[data, next] ...
              |    |        ^ |    | |
               ----         |  ---   |
                            |        |
[p] ------------------------         |
[n] ------> [data, next]             |
                     |               |
                      ---------------

(我们正在设置最后一个链接,从[n] - &gt; [... next]开始)

代码中的注释肯定令人困惑。更好的是“将新项目的下一个列表项设置为给定链接所指向的项目”。这肯定是过于冗长。

答案 7 :(得分:0)

因为您要将它添加到索引中,所以它将“p”向上推到一个节点,以便新节点可以插入到前一个p的索引

答案 8 :(得分:0)

在链接列表中,您可以在任何位置添加新节点。 假设您要在链接列表的开头添加一个节点,您可以通过它来完成 n-&gt; next = start; //新节点的下一个指向第一个节点 start = n; //新节点成为第一个节点 您遇到问题的方法是在给定节点之前添加新节点