Heim > Artikel > Backend-Entwicklung > ngx_queue_t doppelt verknüpfte Liste
ngx_queue_t Doppelt verknüpfte Liste
Struktur
<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>
Die Struktur der gesamten verknüpften Liste ist: Es gibt einen leeren Kopf, der als Anfang und Wächter dient Verwenden Sie die verknüpfte Liste (beim Durchlaufen) und verwenden Sie dann die folgende Methode, um Knoten zu den nachfolgenden Positionen dieses Kopfes hinzuzufügen.
Vom Container bereitgestellte Methoden
方法名 | 参数含义 | 执行意义 |
---|---|---|
ngx_queue_init(h) | h是ngx_queue_t的指针 | 链表容器初始化,空链表 |
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) | 同上 | 移除x元素 |
ngx_queue_split(h,q,n) | 同上 | 将链表分为h->q(不包括q)和q->tail两部分,后一部分的指针存放在n上 |
ngx_queue_add(h,n) | h和n都是双向链表容器指针 | 合并链表,将n接在h之后 |
ngx_queue_middle(h) | 同上 | 返回第N/2 1个元素的指针 |
ngx_queue_sort(h,compfunc) | cmpfunc是元素的比较方法 | 使用**插入排序**cpmfunc原型:ngx_int_t (*cpmfunc)(const ngx_queue_t *a,const ngx_queue_t *b) |
Methoden für Elemente in einer doppelt verknüpften Liste
方法名 | 参数含义 | 执行意义 |
---|---|---|
ngx_queue_next(q) | q为链表中某个结构体变量ngx_queue_t成员的指针 | 返回下一个元素 |
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所在的结构体变量之后 |
Testsortierung
<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>
Hinweis:
Für die verwendete Header-Datei „ngx_queue.h“ habe ich sie aus dem Nginx-Quellcode kopiert und geändert. Es ist ziemlich einfach, also werde ich es nicht tun lade es hoch.
Urheberrechtserklärung: Schmerz ist nur in deinem Kopf.
Das Obige stellt die doppelt verknüpfte Liste ngx_queue_t vor, einschließlich des relevanten Inhalts. Ich hoffe, dass sie für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.