我遇到了两种实现双链表的方法:
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
这种方式在FreeBsd queue.h
中,我想知道为什么它使用指向le_prev
的指针?
struct list_head {
struct list_head *next, *prev;
};
这种方式在linux list.h
中,它只使用了两个简单的指针。
有什么区别?哪个更好,只需使用简单的指针和指针指针或两个简单的指针?
答案 0 :(得分:1)
列表不是“双重链接”,因为列表不能在两个方向上遍历。给出双指针,以便可以快速更改下一个指针。
此外,在c中,结构元素总是连续存储。因此,给定下一个指针的地址,您可以计算前一个节点的地址。但这只会增加代码的复杂性,并要求您计算结构中所有元素的大小。这不值得麻烦。 (你不应该假设这个,并说它是一个双向遍历的链表)
哪个更好?
使用两个简单指针实现通常更好。可能存在双指针实现可能更好的特殊情况。