tailqueue最重要的特点就是在head中增加了一个指向末尾的指针,所以它能够直接在链表的尾部插入数据
一、tail queue的定义宏
1. 链表头的定义,其中包含指向该链表的第一个原素的指针和指向该链表最后一个原素next指针的指针
#define _TAILQ_HEAD(name, type, qual) \
struct name { \
qual type *tqh_first; /*first element */ \
qual type *qual *tqh_last; /*addr of last next element */ \
}
#defineTAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,)
2. 链表中元素的定义,其中包含指向该元素的下一个元素的指针和指向该元素上一个元素的next指针的指针
#define _TAILQ_ENTRY(type, qual) \
struct { ` \
qual type *tqe_next; /*next element */ \
qual type *qual *tqe_prev; /*address of previous next element */\
}
#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,)
二、tail queue的函数宏
1. 初始化链表头
#define TAILQ_INIT(head) do { \
(head)->tqh_first = NULL; \
(head)->tqh_last = &(head)->tqh_first; \
} while (/*CONSTCOND*/0)
2. 在链表头插入元素
#define TAILQ_INSERT_HEAD(head, elm, field) do { \
if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
(head)->tqh_first->field.tqe_prev = \
&(elm)->field.tqe_next; \
else \
(head)->tqh_last = &(elm)->field.tqe_next; \
(head)->tqh_first = (elm); \
(elm)->field.tqe_prev = &(head)->tqh_first; \
} while (/*CONSTCOND*/0)
3. 在链表尾插入元素
#define TAILQ_INSERT_TAIL(head, elm, field)