花了半個小時看了買的書籍,原理已經掌握, 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!