ngx_queue_t 双向链表
结构
typedefstruct ngx_queue_s ngx_queue_t;typedefstruct ngx_queue_s { ngx_queue_t *prev; ngx_queue_t *next;};
整个链表的结构就是:有一个空的头,这个头用作链表的起始和哨兵(遍历时用到),接着用下面的方法向这个头的后续位置加节点。
容器提供的方法
方法名参数含义执行意义
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)
双向链表中元素的方法
方法名参数含义执行意义
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所在的结构体变量之后
测试sort
#include #include ./ngx_queue.h//元素所在结构体typedefstruct _testnode{ u_char *str; ngx_queue_t qele; //包含ngx_queue_t组成双向链表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;}//按顺序打印链表内容void printqueue(ngx_queue_t *head){ ngx_queue_t *pnode = null; for(pnode = ngx_queue_head(head);\ pnode != ngx_queue_sentinel(head);\ pnode = ngx_queue_next(pnode)){ testnode *node = ngx_queue_data(pnode,testnode,qele); printf(%d ,node->num); } printf(\n);}int main(){ ngx_queue_t queuecontainer; //create a ngx_queue_t variable ngx_queue_init(&queuecontainer); //initialize the variableint i = 0; testnode node[5]; for(;i5;++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); //pirnt queue printqueue(&queuecontainer); //sort ngx_queue_sort(&queuecontainer,comptestnode); //print queue after sort printqueue(&queuecontainer); return0;}
注:
对于用到的”ngx_queue.h”头文件,我是从nginx源码中拷贝下来修改了一下,挺简单的,就不上了。
版权声明:pain is just in your mind.
以上就介绍了ngx_queue_t双向链表,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。