ngx_queue_t

来源:互联网 发布:网络小额贷款平台 编辑:程序博客网 时间:2024/05/24 03:17
#include <stdio.h>typedef __u_char u_char;typedef intptr_t        ngx_int_t;typedef struct ngx_queue_s  ngx_queue_t;struct ngx_queue_s {    ngx_queue_t  *prev;    ngx_queue_t  *next;};#define ngx_queue_init(q)                                                     \    (q)->prev = q;                                                            \    (q)->next = q#define ngx_queue_empty(h)                                                    \    (h == (h)->prev)#define ngx_queue_insert_head(h, x)                                           \    (x)->next = (h)->next;                                                    \    (x)->next->prev = x;                                                      \    (x)->prev = h;                                                            \    (h)->next = x#define ngx_queue_insert_after   ngx_queue_insert_head#define ngx_queue_insert_tail(h, x)                                           \    (x)->prev = (h)->prev;                                                    \    (x)->prev->next = x;                                                      \    (x)->next = h;                                                            \    (h)->prev = x#define ngx_queue_head(h)                                                     \    (h)->next#define ngx_queue_last(h)                                                     \    (h)->prev#define ngx_queue_sentinel(h)                                                 \    (h)#define ngx_queue_next(q)                                                     \    (q)->next#define ngx_queue_prev(q)                                                     \    (q)->prev#if (NGX_DEBUG)#define ngx_queue_remove(x)                                                   \    (x)->next->prev = (x)->prev;                                              \    (x)->prev->next = (x)->next;                                              \    (x)->prev = NULL;                                                         \    (x)->next = NULL#else#define ngx_queue_remove(x)                                                   \    (x)->next->prev = (x)->prev;                                              \    (x)->prev->next = (x)->next#endif#define ngx_queue_split(h, q, n)                                              \    (n)->prev = (h)->prev;                                                    \    (n)->prev->next = n;                                                      \    (n)->next = q;                                                            \    (h)->prev = (q)->prev;                                                    \    (h)->prev->next = h;                                                      \    (q)->prev = n;#define ngx_queue_add(h, n)                                                   \    (h)->prev->next = (n)->next;                                              \    (n)->next->prev = (h)->prev;                                              \    (h)->prev = (n)->prev;                                                    \    (h)->prev->next = h;#define ngx_queue_data(q, type, link)                                         \    (type *) ((u_char *) q - offsetof(type, link))ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue);void ngx_queue_sort(ngx_queue_t *queue,    ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *));//使用ngx_queue_t双向链表的例子typedef struct _tagTestNode{u_char* str;ngx_queue_t qEle;int num;}TestNode;ngx_int_t compTestNode(const ngx_queue_t* a, const ngx_queue_t* b){/*首先使用ngx_queue_data方法由ngx_queue_t变量获取元素结构体TestNode的地址*/TestNode* aNode = ngx_queue_data(a, TestNode, qEle);TestNode* bNode = ngx_queue_data(b, TestNode, qEle);//返回num成员的比较结果return (aNode->num) > (bNode->num);}int main(){ngx_queue_t queueContainer;ngx_queue_init(queueContainer);int i = 0;TestNode node[5];for(; i < 5; i++){node[i] = i+100;}ngx_queue_insert_tail(&queueContainer, &node[0].qEle);ngx_queue_insert_head(&queueContainer, &node[1].qEle);ngx_queue_insert_tail(&queueContainer, &node[2].qEle);ngx_queue_insert_after(&queueContainer, &node[3].qEle);ngx_queue_insert_tail(&queueContainer, &node[4].qEle);ngx_queue_t *q;for(q = ngx_queue_head(&queueContainer); q != ngx_queue_sentinel(&queueContainer); q = ngx_queue_next(&queueContainer)){TestNode *eleNode = ngx_queue_data(q, TestNode, qEle);printf("eleNode->num=%d\n", eleNode->num);}ngx_queue_sort(&queueContainer, compTestNode);for(q = ngx_queue_head(&queueContainer); q != ngx_queue_sentinel(&queueContainer); q = ngx_queue_next(&queueContainer)){TestNode *eleNode = ngx_queue_data(q, TestNode, qEle);printf("eleNode->num=%d\n", eleNode->num);}return 0;}

0 0