ホームページ  >  記事  >  バックエンド開発  >  ngx_queue_t 二重リンクリスト

ngx_queue_t 二重リンクリスト

WBOY
WBOYオリジナル
2016-08-08 09:20:191185ブラウズ

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_prev(q)ngx_queue_data(q,type,member) ngx_queue_insert(q,x)
<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_next(q) qはリンクリスト内の構造体変数ngx_queue_tのメンバへのポインタです 次の値を返しますelement
同上 前の要素を返す
q 上記と同様、typeは構造体の型、memberは名前構造体のngx_queue_t q変数が配置されている構造体変数の最初のアドレスを返します
qとxは両方とも特定の構造体変数のngx_queue_tメンバーポインタです 構造体を挿入します変数 x は構造体の後ろです 変数 q は
テストソート 注:

著作権表示: 痛みはあなたの心の中にあるだけです。

上記は ngx_queue_t の二重リンク リストを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:ずっとphp次の記事:ずっとphp