花了半个小时看了买的书籍,原理已经掌握,
根据书上写了代码如下:
typedef struct{ u_char* str; ngx_queue_t qEle;//位置任意 int num;}TestNode;ngx_int_t compTestNode(const ngx_queue_t* a,const ngx_queue_t* b){ TestNode* aNode =ngx_queue_data(a,TestNode,qEle); TestNode* bNode = ngx_queue_data(b,TestNode,qEle); return aNode->num > bNode->num;/* #define ngx_queue_data(a, TestNode, qEle) \ (TestNode*) ((u_char *)a - offsetof(TestNode, qEle))*/}void ngx_queue_test(){ int i=0; ngx_queue_t queueContainer; TestNode node[5]; ngx_queue_init(&queueContainer); for(;i<5;i++) { node[i].num = i ; } //添加节点: 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(q)) { TestNode* eleNode = ngx_queue_data(q,TestNode,qEle); printf("%d\n",eleNode->num); } //排序 ngx_queue_sort(&queueContainer,compTestNode); //开始遍历 for(q=ngx_queue_head(&queueContainer); q!=ngx_queue_sentinel(&queueContainer); q=ngx_queue_next(q)) { TestNode* eleNode = ngx_queue_data(q,TestNode,qEle); printf("%d\n",eleNode->num); } }
其实主要思想总结起来就是以下几点:
1任何数据结构体,里面必需有一个ngx_queue_t变量。
2提供结构体的类型,成员的名字,结构体里的ngx_queue_t变量的指针
可以还原处结构体的首地址出来。这个学过C的都知道了。
3 真正链接在双向链表里的是每个结构体里的ngx_queue_t变量。
4 为了排序,自己要写一个排序函数。
后面就不说了,比较简单的东西,自己领悟吧小伙伴们!
头发长了,要去理发+吃晚餐,周末就这么没鸟。
PS:我一直在想这链接起来的链表是什么样的。
哈哈,感觉就是电线杆上的一排鸟,每只鸟的周围是2个翅膀张开。
你要是看懂了这句话,说明你已经懂了NGINX里的双向链表的真谛了。
BIG CON!