在看核心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 當前節點前乙個節點...