Nginx源碼分析系列4:Nginx裏的雙向鏈表

花了半個小時看了買的書籍,原理已經掌握, node

根據書上寫了代碼以下: 數據結構

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變量的指針 code

能夠還原處結構體的首地址出來。這個學過C的都知道了。 排序

3 真正連接在雙向鏈表裏的是每一個結構體裏的ngx_queue_t變量。 it

4 爲了排序,本身要寫一個排序函數。 class

 

後面就不說了,比較簡單的東西,本身領悟吧小夥伴們! test

頭髮長了,要去理髮+吃晚餐,週末就這麼沒鳥。 變量

PS:我一直在想這連接起來的鏈表是什麼樣的。

哈哈,感受就是電線杆上的一排鳥,每隻鳥的周圍是2個翅膀張開。

你要是看懂了這句話,說明你已經懂了NGINX裏的雙向鏈表的真諦了。

BIG CON!

相關文章
相關標籤/搜索