代码之家  ›  专栏  ›  技术社区  ›  alex

与C中的链表有点混淆

  •  2
  • alex  · 技术社区  · 14 年前

    我在读关于 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 回复  |  直到 14 年前
        1
  •  5
  •   JOTN    14 年前

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

        2
  •  7
  •   Christian P.    14 年前

    因为列表是单链接的 A->B->C->etc ,它必须遍历整个列表才能在末尾添加新元素。

    相反,它添加了新的元素 n 开始的时候 n->next p .

        3
  •  2
  •   codaddict    14 年前

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

    // 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; 
    
        4
  •  2
  •   Nate Kohl    14 年前

    列表添加功能 不一定 p .

    第页 可能间接指向列表开头的节点或列表中的任何其他节点。

    next 字段设置为任意值 第页 正在指向。

    更新时间:

    在密码里, 第页 第页 可以间接指向列表中的第一个节点:

    pointer to pointer usage in a linked list

    add_node 第页 也可以间接指向列表中的其他节点:

    more pointer to pointer usage

    在第二个例子中, 添加节点

        5
  •  1
  •   erenon    14 年前

    新节点被追加到现有列表的开始。

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

        6
  •  1
  •   Michal Sznajder    14 年前

    list_add 函数将元素追加到列表的开头。所以这个评论意味着我们的新元素( n )必须指出名单上的老大( p

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

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

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

        7
  •  1
  •   Vlad    14 年前

    功能 list_add p ,这是指向链接的指针(也是指针),它指向需要在其前面插入新数据的元素。 n 是新分配的节点,所以 n->next = *p; 基本上说“新节点的下一个链接设置为指向 *p ".

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

    代码中的注释确实令人困惑。最好是“将新项的下一个列表项设置为给定链接指向的项”。这绝对是太冗长了。

        8
  •  0
  •   kyndigs    14 年前

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

        9
  •  0
  •   Shweta    14 年前

    在链接列表中,可以将新节点添加到任何位置。 n->next=start;//新节点的next指向第一个节点 start=n;//new node成为第一个节点