TAILQ_QUEUE队列

来源:互联网 发布:萧敬腾雨神真相知乎 编辑:程序博客网 时间:2024/06/05 22:31



代码实现如下:

/* * Tail queue definitions. */#define TAILQ_HEAD(name, type)\struct name {\struct type *tqh_first;/* first element */\struct type **tqh_last;/* addr of last next element */\}#define TAILQ_HEAD_INITIALIZER(head)\{ NULL, &(head).tqh_first }#define TAILQ_ENTRY(type)\struct {\struct type *tqe_next;/* next element */\struct type **tqe_prev;/* address of previous next element */\}/* * tail queue access methods */#defineTAILQ_FIRST(head)((head)->tqh_first)#defineTAILQ_END(head)NULL#defineTAILQ_NEXT(elm, field)((elm)->field.tqe_next)#define TAILQ_LAST(head, headname)\(*(((struct headname *)((head)->tqh_last))->tqh_last))/* XXX */#define TAILQ_PREV(elm, headname, field)\(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))#defineTAILQ_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. */#defineTAILQ_INIT(head) do {\(head)->tqh_first = NULL;\(head)->tqh_last = &(head)->tqh_first;\} while (0)#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 (0)#define TAILQ_INSERT_TAIL(head, elm, field) do {\(elm)->field.tqe_next = NULL;\(elm)->field.tqe_prev = (head)->tqh_last;\*(head)->tqh_last = (elm);\(head)->tqh_last = &(elm)->field.tqe_next;\} while (0)#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {\if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\(elm)->field.tqe_next->field.tqe_prev =\    &(elm)->field.tqe_next;\else\(head)->tqh_last = &(elm)->field.tqe_next;\(listelm)->field.tqe_next = (elm);\(elm)->field.tqe_prev = &(listelm)->field.tqe_next;\} while (0)#defineTAILQ_INSERT_BEFORE(listelm, elm, field) do {\(elm)->field.tqe_prev = (listelm)->field.tqe_prev;\(elm)->field.tqe_next = (listelm);\*(listelm)->field.tqe_prev = (elm);\(listelm)->field.tqe_prev = &(elm)->field.tqe_next;\} while (0)#define TAILQ_REMOVE(head, elm, field) do {\if (((elm)->field.tqe_next) != NULL)\(elm)->field.tqe_next->field.tqe_prev =\    (elm)->field.tqe_prev;\else\(head)->tqh_last = (elm)->field.tqe_prev;\*(elm)->field.tqe_prev = (elm)->field.tqe_next;\} while (0)#define TAILQ_REPLACE(head, elm, elm2, field) do {\if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL)\(elm2)->field.tqe_next->field.tqe_prev =\    &(elm2)->field.tqe_next;\else\(head)->tqh_last = &(elm2)->field.tqe_next;\(elm2)->field.tqe_prev = (elm)->field.tqe_prev;\*(elm2)->field.tqe_prev = (elm2);\} while (0)

0 0