Nginx中双向链表ngx_queue_t的实现及用法总结

ngx_queue_t双向链表是Nginx提供的轻量级链表容器,它与Nginx的内存池无关,因此,这个链表将不会负责分配内存来存放链表元素。这意味着,任何链表元素都需要通过其他方式来分配它所需要的内存空间,ngx_queue_t并不存储元素,只是把这些已经分配好内存的元素用双向链表连接起来。

链表作为顺序容器的优势在于,它可以高效地执行插入、删除、合并等操作,在移动链表中的元素时只需要修改指针的指向,因此,它很适合频繁修改容器的场合。

相对于Nginx其他顺序容器,ngx_queue_t容器的优势在于:

 ·实现了排序功能。

·它非常轻量级,是一个纯粹的双向链表。它不负责链表元素所占内存的分配,与Nginx封装的ngx_pool_t内存池完全无关。

·支持两个链表间的合并。

 

ngx_queue_t仅有两个成员:prev、next,如下所示:

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

ngx_queue_t的用法

使用双向链表容器时,需要用一个ngx_queue_t结构体表示容器本身,而这个结构体共有12个方法可供使用:




对于链表中的每一个元素,其类型可以是任意的struct结构体,但这个结构体中必须要有一个ngx_queue_t类型的成员,在向链表容器中添加、删除元素时都是使用的结构体中ngx_queue_t类型成员的指针。当ngx_queue_t作为链表的元素成员使用时,它具有如下所列出的4种方法:




ngx_queue_t双向链表的实现

如图所示,当容器为空时,prev和next都将指向容器本身,如果在某个结构体中定义了ngx_queue_t容器,其prev指针和next指针都会指向ngx_queue_t成员的地址



当容器不为空时,ngx_queue_t容器的next指针会指向链表的第1个元素,而prev指针会指向链表的最后1个元素。如下图所示,这时链表中只有1个链表元素,容器的next指针和prev指针都将指向这个唯一的链表元素。

对于每个链表元素来说,其prev成员都指向前一个元素(不存在时指向链表容器),而next成员则指向下一个元素(不存在时指向链表容器),




当容器中有两个元素时,prev和next的指向如下图

下图很好地诠释了前面的定义,容器中的prev成员指向最后1个也就是第2个元素,next成员指向第1个元素。第1个元素的prev成员指向容器本身,而其next成员指向第2个元素。第2个元素的prev成员指向第1个元素,其next成员则指向容器本身。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值