我正在阅读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上。
答案 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
可以间接指向列表中的第一个节点:
...这意味着add_node
将在列表的开头插入一个新节点。但p
也可以间接指向列表中的其他节点:
在第二个示例中,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; //新节点成为第一个节点 您遇到问题的方法是在给定节点之前添加新节点