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

拟墨画扇 提交于 2019-12-04 17:56:41

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

根据书上写了代码如下:

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!

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!