这两种不同的实现双链表的方法有什么区别?

时间:2014-11-14 08:13:09

标签: c list

我遇到了两种实现双链表的方法:

#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中,它只使用了两个简单的指针。

有什么区别?哪个更好,只需使用简单的指针和指针指针或两个简单的指针?

1 个答案:

答案 0 :(得分:1)

列表不是“双重链接”,因为列表不能在两个方向上遍历。给出双指针,以便可以快速更改下一个指针。

此外,在c中,结构元素总是连续存储。因此,给定下一个指针的地址,您可以计算前一个节点的地址。但这只会增加代码的复杂性,并要求您计算结构中所有元素的大小。这不值得麻烦。 (你不应该假设这个,并说它是一个双向遍历的链表)

  

哪个更好?

使用两个简单指针实现通常更好。可能存在双指针实现可能更好的特殊情况。