【问题标题】:Creating a tail and head in a list by value in C在 C 中按值在列表中创建尾部和头部
【发布时间】:2015-07-03 18:41:33
【问题描述】:

我想在 C 中创建一个列表,其中头部和尾部不是指针,而是按值排列的节点。可以吗?

我想用头部和尾部作为一个空框架来放置列表。我确实知道如何将它创建为指针,并且只想知道这一点,因为我只是意识到我不知道如何单独做到这一点。

struct List{Node head, Node tail};
struct Node{struct Node* next, struct Node* prev, void* data};

【问题讨论】:

  • 语法上,你需要完整定义struct Node,并在创建struct List之前创建typedef struct Node Node;。要创建List,编译器必须知道Node 的大小。
  • Ron 你问的是创建一个循环链表,其中第一个节点(就是第一个节点)和最后一个节点也只是一个节点(指向到第一个)。这确实是一个有效的替代方案。您有两种类型的列表。非循环(您的正常 HEAD/TAIL 列表,其中 HEAD/TAIL 只是在某些情况下执行或不保存数据的标记)。然后你有一个循环列表,其中所有节点都是等效的数据节点,带有指向下一个(在单链表的情况下)的指针,或者在双链表的情况下都指向下一个/上一个的指针。

标签: c list pass-by-value


【解决方案1】:

具有虚拟头部和尾部的列表(您在此处介绍的方式)的主要优点是您在列表函数(插入、删除等)中没有特殊情况。 头尾指针让您处理每个函数中的特殊情况。

【讨论】:

    【解决方案2】:

    不可能有一个由非指针对象组成的链表1,而且根本没有意义,因为列表的全部意义在于nextprevious 成员 POINT 指向同一类型的另一个实例,因此它们必须是指针。


    [1]单链表或双链表。

    【讨论】:

    • 拥有一个指向列表其余部分的节点,但不是作为指向节点的指针,而是作为一个节点,它将在其中保存指针。 List{ 节点头; //头尾是节点不是指针节点尾; } 节点{ 节点* 下一个;节点* 上一个;无效*数据; }
    • @RonAham 是的,该代码将起作用。只需清除所有指向NULL的指针,然后设置list.head.next=&list.taillist.tail.prev=&list.head创建一个空列表。
    • 如果将列表存储在数组中并在结构中记录列表中下一个或前一个元素的索引来代替指针,则可以创建链表的等效项。此外,您可以重新分配数组,而无需调整任何列表索引。因此:struct Data { int next; int prev; void *data; }; 和一个数组,例如 struct Data data[1024];。给定struct Data *dp = &data[23];,列表中的下一个元素是data[dp->next],前一个元素是data[dp->prev]。或者,如果您有int idx = &data[23];,则下一个元素是data[data[idx].next],等等。
    • @JonathanLeffler 有趣的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2013-03-17
    • 1970-01-01
    • 2012-07-20
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多