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;
};