花了半个小时看了买的书籍,原理已经掌握,
根据书上写了代码如下:
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!
来源:oschina
链接:https://my.oschina.net/u/1382024/blog/182497