您实际上不需要使用指针来实现公开链表接口的数据结构,但您确实需要它们来提供链表的性能特征。
指针的替代品是什么?好吧,item
需要有一些方法来参考下一项。由于各种原因,它无法聚合下一项,其中一个原因是这会使结构“递归”,因此无法实现:
// does not compile -- an item has an item has an item has an item has...
typedef struct item
{
type data;
struct item next;
} Item;
您可以做的是拥有一组项目并在此之上实现链表:
Item *storage[100];
typedef struct item
{
type data;
int next; // points to the index inside storage of the next item
} Item;
这看起来可行;你可以有一个函数将项目添加到列表中,另一个函数将它们删除:
void add_after(Item *new, Item *existing);
void remove(Item *existing);
这些函数要么existing
从数组中删除(注意更新next
前一个项目的“指针”)创建一个空槽,要么找到该existing
项目并插入new
一个空槽storage
(更新next
到那里)。
这样做的问题是,这使得add_after
andremove
操作无法在恒定时间内实现,因为您现在需要搜索数组并在空间不足时重新分配它。
由于恒定时间添加/删除是人们使用链表的原因,这使得非指针方法仅作为智力练习有用。对于真正的列表,使用指针意味着您可以在恒定时间内执行这些操作。