Nginx源码分析系列4:Nginx里的双向链表

花了半个小时看了买的书籍,原理已经掌握,

根据书上写了代码如下:

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!

 

 

你可能感兴趣的:(nginx,nginx,双向列表)