0%

使用sys_queue.h

<sys/queue.h>是一組源於BSD的,提供鏈結串列功能的標頭檔。
他所有的功能都是由巨集實作的,具有良好的可移植性,很多libc都有包含這個標頭檔,需要資料結構的地方可以使用這個標頭檔,而不需要自己寫。

TAILQ(雙向鏈結串列)

TAILQ由兩個部份組成,雙向鏈結串列和一個headhead指向這個鏈結串列的頭和尾。
要使用需要先將TAILQ_ENTRY(type)引入需要放入串列內的結構:

1
2
3
4
struct node {
int data;
TAILQ_ENTRY(node) NODE;
};

其中TAILQ_ENTRY(type)的參數是自己定義結構的type,NODE則是成員,表示串列的nextprev
TAILQ_ENTRY的定義為:

1
2
3
4
5
#define TAILQ_ENTRY(type)                                            \
struct { \
struct type *tqe_next; /* next element */ \
struct type **tqe_prev;/* addr of previous next element*/ \
}

再來是需要宣告一個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
2
3
struct node *r = malloc(sizeof(struct node));
r->data = 1;
TAILQ_INSERT_HEAD(&head, r, NODE);

TAILQ_INSERT_TAIL(head, elm, field)

插入尾部。

1
2
3
struct node *r = malloc(sizeof(struct node));
r->data = 1;
TAILQ_INSERT_TAIL(&head, r, NODE);

TAILQ_FOREACH(var, head, field)

遍歷所有節點。

1
2
3
TAILQ_FOREACH(r, &head, NODE) {
printf("r = 0x%x r->data = %d\n", r, r->data);
}

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
2
TAILQ_REMOVE(&head, r, NODE);
free(r);