簡體   English   中英

這兩種實現雙重鏈接列表的不同方式有什么區別?

[英]What is the difference between this two different ways to implement double linked 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 ,它僅使用兩個簡單的指針。

有什么區別? 哪個更好,僅使用一個簡單的指針和一個指向該指針的指針還是兩個簡單的指針?

該列表不是“雙向鏈接”的,這意味着該列表不能在兩個方向上遍歷。 提供了雙指針,以便可以快速更改下一個指針。

同樣,在c中,結構元素始終連續存儲。 因此,根據下一個指針的地址,您可以計算上一個節點的地址。 但這只會增加代碼的復雜性,並要求您計算結構中所有元素的大小。 這不值得麻煩。 (您不應假設這是一個具有兩邊遍歷的鏈表)

哪個更好?

用兩個簡單的指針實現通常更好。 在某些特殊情況下,雙指針實現可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM