queue结构分析(二)ngx_queue 未完

nginx的队列结构是一个双链接指针循环队列,只包含队列指针。提供的办法只对队列指针操作,不负责队列元素的分配。

 

一、队列定义

typedef struct ngx_queue_s  ngx_queue_t;

struct ngx_queue_s {
    ngx_queue_t  *prev;
    ngx_queue_t  *next;
};

 

二、队列操作办法

 

#define ngx_queue_init(q)                    --初始化队列指针

#define ngx_queue_empty(h)               --判断队列是否为空

#define ngx_queue_insert_head(h, x)  --把队列成员x插入到h队列头部

#define ngx_queue_insert_after   ngx_queue_insert_head  --同上

#define ngx_queue_insert_tail(h, x)     --把队列成员X插入到h队列尾部

#define ngx_queue_head(h)                 --获取队列h头部成员

#define ngx_queue_last(h)                   --获取队列h尾部成员

#define ngx_queue_sentinel(h)            --返回h

#define ngx_queue_next(q)                 --获取队列成员q朝队尾方向下一个成员

#define ngx_queue_prev(q)                 --获取队列成员q朝队头方向上一个成员

#define ngx_queue_remove(x)            --从队列中移除成员x

#define ngx_queue_split(h, q, n)         --??

#define ngx_queue_add(h, n)             --??

#define ngx_queue_data(q, type, link)  --返回队列成员(type*)指针

ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue);   --??

void ngx_queue_sort(ngx_queue_t *queue,
    ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *));  --对队列排序

 

三、 使用

 

只包含队列指针的队列使用

 

ngx_queue_t header;    --队列头

ngx_queue_t A,B,C,D; --队列成员

 

初始化,让prev、next指针指向自己

ngx_queue_init(&header) ;

ngx_queue_init(&A) ;

ngx_queue_init(&B) ;

ngx_queue_init(&C) ;

ngx_queue_init(&D) ;

 

 

 

A1)插入A到队列头部,结构图                                                B1)插入A到队列尾部,结构图   

ngx_queue_insert_head(&header, &A)                             ngx_queue_insert_tail(&header, &A)

 

A                                                                    

 

A2)插入B到队列头部,结构图                                                  B2)插入B到队列尾部,结构图   

ngx_queue_insert_head(&header, &B)                              ngx_queue_insert_tail(&header, &B)

 

B                                                                         

 

 

 

A3)插入C到队列头部,结构图                                                    B3)插入C到队列尾部,结构图

ngx_queue_insert_head(&header, &C)                                ngx_queue_insert_tail(&header, &C)

 

C                                         

 

A4)插入D到队列尾部,结构图                                                    B4)插入D到队列头部,结构图

ngx_queue_insert_tail(&header, &D)                                   ngx_queue_insert_head(&header, &D)

 

D                                         

 

A5)插入A、B、C、D后                                                               B5)插入A、B、C、D后,

--first M就是C                                                                       --first M就是D

ngx_queue_t* firstM = ngx_queue_head(&header) ;           ngx_queue_t* firstM = ngx_queue_head(&header) ;

--lastM就是D                                                                       --lastM就是C

ngx_queue_t* lastM = ngx_queue_last(&header) ;              ngx_queue_t* lastM = ngx_queue_last(&header) ; 

--nextM就是A                                                                      --nextM就是C

ngx_queue_t* nextM = ngx_queue_next(&B);                     ngx_queue_t* nextM = ngx_queue_next(&B);

--prevM就是C                                                                      --prevM就是A

ngx_queue_t* prevtM = ngx_queue_prev(&B);                    ngx_queue_t* prevtM = ngx_queue_prev(&B);  

 

大家看到使用ngx_queue_insert_head和ngx_queue_insert_tai不同顺序后,所谓的头部和尾部有所区别。

 

先ngx_queue_insert_head后ngx_queue_insert_tail,则靠近header最近元素是尾部,另一端是头部。

先ngx_queue_insert_tail后ngx_queue_insert_head,则靠近header最近元素是头部,另一端是尾部。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值