ngx_queue_t 二重リンク リスト
構造
<code><span>typedef</span><span>struct</span> ngx_queue_s ngx_queue_t;
<span>typedef</span><span>struct</span> ngx_queue_s {
ngx_queue_t *prev;
ngx_queue_t *next;
};</code>
ログイン後にコピー
リンク リスト全体の構造は次のとおりです: 空のヘッドがあり、リンク リストの開始点および番兵として使用されます (トラバーサル中に使用されます)。次に、次のものを使用します。このヘッド位置プラスノードをフォローアップするメソッド。
コンテナが提供するメソッド
メソッド名 |
パラメータの意味 |
実行の意味 |
ngx_queue_init(h) |
hはngx_queue_tのポインタ |
チェーン テーブルコンテナの初期化、空のリンクlist |
ngx_queue_empty(h) |
上記と同じ |
リンクされたリストが空かどうかを確認する |
nxg_queue_insert_head(h,x) |
h上記と同様、xは挿入されるngx_queue_tポインタです | 頭挿入方法 |
nxg_queue_insert_head(h,x ) |
同上 |
末尾挿入方法 |
ngx_queue_head(h) |
同上 |
戻るポインタに戻る |
ngx_queue_tail(h) |
同上 |
末尾ポインタに戻る |
ngx_queue_sentinel(h) | 同上 |
構造体ポインタを返す |
ngx_queue_remove(x) |
同上 |
-> を削除します; q (q を除く) と q->tail の 2 つの部分があり、後半のポインタは n |
ngx_queue_add(h,n) |
h に格納され、n は両方とも二重リンク リスト コンテナ ポインタです。 |
リンクされたリストをマージします。nの後にhが続きます |
ngx_queue_middle(h) |
上記と同じ |
N/2+1番目の要素のポインタを返します |
ngx_queue_sort(h,compfunc) |
cmpfuncは要素の比較方法です |
** Insert sort ** CPMFUNCプロトタイプ: ngx_int_t (*cpmfunc) (const ngx_queue_t*a, const ngx_queue_t*b) を使用します |
|
2つの要素のメソッド名-way リンクリスト |
|
パラメータのパラメータ
実行の意味
ngx_queue_next(q) |
qはリンクリスト内の構造体変数ngx_queue_tのメンバへのポインタです |
次の値を返しますelement |
ngx_queue_prev(q)
同上 |
前の要素を返す |
|
ngx_queue_data(q,type,member)
q 上記と同様、typeは構造体の型、memberは名前構造体のngx_queue_t |
q変数が配置されている構造体変数の最初のアドレスを返します |
|
ngx_queue_insert(q,x)
qとxは両方とも特定の構造体変数のngx_queue_tメンバーポインタです |
構造体を挿入します変数 x は構造体の後ろです 変数 q は |
|
テストソート | <code><span>#include <stdio.h></span><span>#include "./ngx_queue.h"</span><span>//元素所在结构体</span><span>typedef</span><span>struct</span> _TestNode{
u_char *str;
ngx_queue_t qEle; <span>//包含ngx_queue_t组成双向链表</span><span>int</span> num;
}TestNode;
<span>//设置的比较函数</span>
ngx_int_t compTestNode(<span>const</span> ngx_queue_t *a,<span>const</span> ngx_queue_t *b){
TestNode *aNode = ngx_queue_data(a, TestNode, qEle);
TestNode *bNode = ngx_queue_data(b, TestNode, qEle);
<span>return</span> aNode->num > bNode->num;
}
<span>//按顺序打印链表内容</span><span>void</span> printQueue(ngx_queue_t *head){
ngx_queue_t *pNode = NULL;
<span>for</span>(pNode = ngx_queue_head(head);\
pNode != ngx_queue_sentinel(head);\
pNode = ngx_queue_next(pNode)){
TestNode *node = ngx_queue_data(pNode,TestNode,qEle);
<span>printf</span>(<span>"%d "</span>,node->num);
}
<span>printf</span>(<span>"\n"</span>);
}
<span>int</span> main(){
ngx_queue_t queueContainer; <span>//Create a ngx_queue_t variable</span>
ngx_queue_init(&queueContainer); <span>//Initialize the variable</span><span>int</span> i = <span>0</span>;
TestNode node[<span>5</span>];
<span>for</span>(;i<<span>5</span>;++i)
node[i].num = i;
<span>//可以考虑一下插入后的顺序</span>
ngx_queue_insert_tail(&queueContainer,&node[<span>0</span>].qEle);
ngx_queue_insert_head(&queueContainer,&node[<span>1</span>].qEle);
ngx_queue_insert_tail(&queueContainer,&node[<span>2</span>].qEle);
ngx_queue_insert_after(&queueContainer,&node[<span>3</span>].qEle);
ngx_queue_insert_tail(&queueContainer,&node[<span>4</span>].qEle);
<span>//Pirnt queue</span>
printQueue(&queueContainer);
<span>//Sort</span>
ngx_queue_sort(&queueContainer,compTestNode);
<span>//Print queue after sort</span>
printQueue(&queueContainer);
<span>return</span><span>0</span>;
}</code>
ログイン後にコピー
注: |
| 使用する「ngx_queue.h」ヘッダーファイルは、Nginx のソースコードからコピーして修正しました。とても簡単なのでアップしません。
著作権表示: 痛みはあなたの心の中にあるだけです。
上記は ngx_queue_t の二重リンク リストを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。