list add tail 雙向鍊錶實現分析

2021-06-09 05:05:11 字數 2332 閱讀 9419

在看核心v4l2示例**driver/media/video/vivi.c時 ,看到list_add_tail()函式,現在對其進行分析:

[cpp]view plain

copy

print?

struct list_head ;  

list_add_tail(&buf->vb.queue, &vid->active);  

/*** list_add_tail - add a new entry

* @new: new entry to be added

* @head: list head to add it before

** insert a new entry before the specified head.

* this is useful for implementing queues.

*/static __inline__ void list_add_tail(struct list_head *_new, struct list_head *head)  

/** insert a new entry between two known consecutive entries.

** this is only for internal list manipulation where we know

* the prev/next entries already!

*/static __inline__ void __list_add(struct list_head * _new,  

struct list_head * prev,  

struct list_head * next)    

struct list_head ;

list_add_tail(&buf->vb.queue, &vid->active);

/** * list_add_tail - add a new entry

* @new: new entry to be added

* @head: list head to add it before

* * insert a new entry before the specified head.

* this is useful for implementing queues.

*/static __inline__ void list_add_tail(struct list_head *_new, struct list_head *head)

/* * insert a new entry between two known consecutive entries.

* * this is only for internal list manipulation where we know

* the prev/next entries already!

*/static __inline__ void __list_add(struct list_head * _new,

struct list_head * prev,

struct list_head * next)

很多地方說:這個函式完成的功能就是新增乙個新的結點在head的左邊,其實不然,它是從右向左在head->priv和head兩個節點之間插入_new。

假設剛開始建立鍊錶,只有struct list_head *head,

那麼前兩句話有用:將next->prev = _new;

_new->next = next;

這就是將new節點新增到head 節點的左邊,那麼接 下來兩句沒用:   _new->prev = prev;  prev->next = _new;

如果head左邊已近有了其他節點,那麼呼叫list_add_tail()函式後,前邊兩句的功能一樣,都是把新的節點新增在head左邊,而後兩句就是把新節點新增在原來head之前節點(head->priv)右邊,這樣就串起來了。

那list_add就反過來,把新的節點新增在head和head之後的節點(head->next)之間;

關於list_add和list_add_tail建立棧和fifo:

list_add和list_add_tail都是在head兩邊插入新的節點,所以list_add先插入的節點向右移,head->next是最後插入的節點,list_add_tail先插入的節點向左移,head->next是最先插入的節點;

遍歷鍊錶都是從head開始向下,所以用list_add建立的鍊錶先訪問的是最後插入的節點,類似於棧;list_add_tail建立的鍊錶先訪問的是最先插入的節地點,類似於fifo。

list add tail 新增雙向鍊錶結點講解

我是在看linux 的input subsystem 的時候,用到的這個函式,當時我對鍊錶還不怎麼清楚 struct list head list add tail dev node,input dev list list add tail add a new entry new new entry...

mysql 雙向鍊錶 雙向鍊錶

雙向鍊錶是鍊錶變型,相比於單鏈表導航或者是向前和向後的兩種方式。以下是重要的術語來理解雙向鍊錶的概念 link 鍊錶的每個鏈路儲存資料稱為乙個元素。linkedlist linkedlist包含連線鏈結到名為首先第乙個鏈結,並稱為最後的最後乙個鏈結 last 雙向鍊錶表示 按照如上圖中所示,以下是要...

雙向鍊錶(鍊錶)

雙向鍊錶 每個節點包含指向後繼節點的指標和指向前驅節點的指標。繼承關係圖 實體圖 duallinklist.h duallinklist 雙向鍊錶類模板 成員變數 node 節點實體 m header 頭節點 m length 鍊錶長度 m step 步進長度 m current 當前節點前乙個節點...