1.概述
最近找來libevent的原始碼學習了一下,看到用巨集實現的資料結構甚是驚訝,把其中尾佇列的**copy出來test了一下.個人感覺用巨集實現該佇列的思想是c++的模板的思想.我自己實現乙個佇列的思路肯定是寫乙個佇列 中節點的結構體然後針對該結構體實現佇列的基本操作.這樣的佇列只能使用於寫好的節點….而libevent實現的版本是不依賴於實際的節點的.換句話說,我們有兩個類,乙個student,乙個teacher,該佇列既可以把student 作為佇列連線起來,也可以將teacher連線起來.相當於 taiq ,taiq. 而且針對同乙個結構體(類) 可以實現多個佇列,比如說所有學生連線成乙個佇列,再把其中的男學生連線為乙個佇列.
2實現
#define tailq_head(name, type) \
struct name
#define tailq_head_initializer(head) \
#define tailq_entry(type) \
struct
/* * tail queue access methods
*/#define tailq_first(head) ((head)->tqh_first)
#define tailq_end(head) null
#define tailq_next(elm, field) ((elm)->field.tqe_next)
#define tailq_last(head, headname) \
(*(((struct headname *)((head)->tqh_last))->tqh_last))
/* *** */
#define
tailq_prev
(elm, headname, field) \
(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
#define
tailq_empty
(head) \
(tailq_first(head) == tailq_end(head))
#define
tailq_foreach
(var, head, field) \
for((var) = tailq_first(head); \
(var) != tailq_end(head); \
(var) = tailq_next(var, field))
#define
tailq_foreach_reverse
(var, head, headname, field) \
for((var) = tailq_last(head, headname); \
(var) != tailq_end(head); \
(var) = tailq_prev(var, headname, field))
/* * tail
queue
functions.
*/#define
tailq_init
(head)
do while (0)
#define tailq_insert_head(head, elm, field) do while (0)
#define tailq_insert_tail(head, elm, field) do while (0)
#define tailq_insert_after(head, listelm, elm, field) do while (0)
#define tailq_insert_before(listelm, elm, field) do while (0)
#define tailq_remove(head, elm, field) do while (0)
#define tailq_replace(head, elm, elm2, field) do while (0)
3測試
針對最後乙個功能點進行了簡單的測試,以加深記憶和理解
#include "queue.h"
#include
#include
#define nqueue 5
struct
event;
tailq_head(eventqueue,event);
tailq_head(activequeue,event);
struct eventqueue event_queue_head;
struct activequeue active_queue_head;
void init()
int main()
struct
event* var = null;
tailq_foreach(var,&event_queue_head,queue_field)
printf("\n");
tailq_foreach(var,&active_queue_head,active_queue_field)
return
0;}
實現了乙個結構體 event , 申請了5個event 並把它們連線成兩個佇列.乙個佇列中包含了所有的event,乙個佇列中包含了值為偶數的event.
列印結果:
~/***x ᐅ ./a.out
the valueis0
the valueis1
the valueis2
the valueis3
the valueis4
the valueis0
the valueis2
the value
is4
libevent中的尾佇列
在 libevent 原始碼中,包括註冊事件佇列 eventqueue 和啟用事件佇列 activequeues 在內的很多地方都用到了尾佇列這種資料結構。而尾佇列的實現有點複雜,因此寫一篇部落格分析一下 2.1 entry結構體 libevent 中尾佇列的 entry 即尾佇列元素 結構體定義如...
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...
資料結構 佇列
資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...