C中链表的指针底部和顶部

C中链表的指针底部和顶部,c,linked-list,C,Linked List,基于链表的数据结构堆栈具有 指向堆栈的成员 所以我的问题是,我们能用同样的方法创建一个链表吗?如果我们想在链表后面添加新成员,我们不需要遍历整个链表 struct listnode { struct listnode* next; int val; }; struct linkedlist { struct listnode* base; struct listnode* top; }

基于链表的数据结构堆栈具有 指向堆栈的成员

所以我的问题是,我们能用同样的方法创建一个链表吗?如果我们想在链表后面添加新成员,我们不需要遍历整个链表

 struct listnode
    {
         struct listnode* next;
         int val;
    };
    struct linkedlist
    {
        struct listnode* base;
        struct listnode* top;
    }

这是合适的吗?

没有什么可以阻止您使用上面定义的结构对创建数据结构。然而,链表更像是一个双端队列,您可以在前面或后面添加或删除元素,而无需遍历该列表。类似地,可以从任意一端添加或获取元素的堆栈也倾向于退出队列

我认为正在发生的是,您正在混淆正式接口和底层数据结构。因此,如果您使用API创建的代码允许在可以遍历和插入/删除的项目链表的任一端添加或删除元素,则可以使用该API来表示堆栈、链表或出列,具体取决于您使用的API的哪些部分以及如何命名它们。

纯堆栈只需要一个顶部指针。也许您正在使用该数据结构作为队列,在末尾添加,从开头获取

链表只需要一个头,但在末尾加上一个尾是有益的

struct linkedlist
{
    struct listnode* head;
    struct listnode* tail;
    int count; // Might be useful
}
我用传统的名字

人们可能会提到双链接列表,其中包括:


这将允许完全对称地使用头和尾。

那么这两个代码之间有什么区别?没有太大区别,我只是使用第一个代码的方式创建一个链接列表,就像我在第二个代码中编写的一样。请稍等。您刚刚重命名了结构,并认为代码的行为会有所不同?这两个代码分别用于创建堆栈和链表。如果有尾部指针,则不需要遍历列表以添加到末尾??如果在最后一个节点上保持尾部点对点,则为“是”。事实上,如果改用别名struct node**tail,则可以使用tail=&head;以及更高版本:*tail=newNode;tail=&*tail->next;它将填充头部或下一个头部。
struct linkedlist
{
    struct listnode* head;
    struct listnode* tail;
    int count; // Might be useful
}
struct node
{
     struct node* previous;
     struct node* next;
     int val;
};