<sys/queue.h>是一組源於BSD的,提供鏈結串列功能的標頭檔。
他所有的功能都是由巨集實作的,具有良好的可移植性,很多libc都有包含這個標頭檔,需要資料結構的地方可以使用這個標頭檔,而不需要自己寫。
TAILQ(雙向鏈結串列)
TAILQ由兩個部份組成,雙向鏈結串列和一個head,head指向這個鏈結串列的頭和尾。
要使用需要先將TAILQ_ENTRY(type)引入需要放入串列內的結構:
1 | struct node { |
其中TAILQ_ENTRY(type)的參數是自己定義結構的type,NODE則是成員,表示串列的next和prev。
TAILQ_ENTRY的定義為:
1 |
再來是需要宣告一個head,來管理整個串列,可以使用TAILQ_HEAD(name, type):
1 | TAILQ_HEAD(q_head, node) head; |
第一個參數可填可不填。
TAILQ_INIT(head)
在使用之前,需要對head做初始化。
1 | TAILQ_INIT(&head); |
TAILQ_INSERT_HEAD(head, elm, field)
插入頭部。
1 | struct node *r = malloc(sizeof(struct node)); |
TAILQ_INSERT_TAIL(head, elm, field)
插入尾部。
1 | struct node *r = malloc(sizeof(struct node)); |
TAILQ_FOREACH(var, head, field)
遍歷所有節點。
1 | TAILQ_FOREACH(r, &head, NODE) { |
TAILQ_FIRST(head)
取得第一個節點。
1 | r = TAILQ_FIRST(&head); |
TAILQ_LAST(head, headname)
取得最後一個節點。
1 | r = TAILQ_LAST(&head, q_head); |
TAILQ_REMOVE(head, elm, field)
從串列中移除一個節點。
1 | TAILQ_REMOVE(&head, r, NODE); |