学习,思考,记录,分享。

本博客()贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!

Content

0.序

1.队列结构

2.队列操作

2.1在头节点之后插入

2.2在尾节点之后插入

2.3删除节点

2.4分割队列

2.5链接队列

2.6获取中间节点

2.7队列排序

2.8如何获取队列节点数据

3.一个例子

3.1代码

3.2如何编译

3.3运行结果

4.小结

0.序

1.队列结构

typedef struct ngx_queue_s ngx_queue_t;struct ngx_queue_s {//队列结构ngx_queue_t *prev;ngx_queue_t *next;};

2.队列操作

队列有如下操作。

//初始化队列ngx_queue_init(q)//判断队列是否为空ngx_queue_empty(h)//在头节点之后插入新节点ngx_queue_insert_head(h, x)//在尾节点之后插入新节点ngx_queue_insert_tail(h, x)//删除节点xngx_queue_remove(x)//分割队列ngx_queue_split(h, q, n)//链接队列ngx_queue_add(h, n)//获取队列的中间节点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*))

其中,插入节点、取队列头、取队列尾等操作由宏实现,获取中间节点、排序等操作由函数实现。下面简单介绍。

2.1在头节点之后插入

#define ngx_queue_insert_head(h, x)\(x)->next = (h)->next;\(x)->next->prev = x;\(x)->prev = h;\(h)->next = x画出该操作的逻辑图,如下。

2.2在尾节点之后插入

#define ngx_queue_insert_tail(h, x)\(x)->prev = (h)->prev;\(x)->prev->next = x;\(x)->next = h;\(h)->prev = x

该操作的逻辑图如下。

2.3删除节点

#if (NGX_DEBUG)#define ngx_queue_remove(x)\(x)->next->prev = (x)->prev;\(x)->prev->next = (x)->next;\(x)->prev = NULL;\(x)->next = NULL#else#define ngx_queue_remove(x)\(x)->next->prev = (x)->prev;\(x)->prev->next = (x)->next#endif该操作的逻辑图如下。

2.4分割队列

#define ngx_queue_split(h, q, n)\(n)->prev = (h)->prev;\(n)->prev->next = n;\(n)->next = q;\(h)->prev = (q)->prev;\(h)->prev->next = h;\(q)->prev = n;

2.5链接队列

#define ngx_queue_add(h, n)\(h)->prev->next = (n)->next;\(n)->next->prev = (h)->prev;\(h)->prev = (n)->prev;\(h)->prev->next = h;

2.6获取中间节点

/* * find the middle queue element if the queue has odd number of elements * or the first element of the queue’s second part otherwise */ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue){ngx_queue_t *middle, *next;middle = ngx_queue_head(queue);if (middle == ngx_queue_last(queue)) {return middle;}next = ngx_queue_head(queue);for ( ;; ) {middle = ngx_queue_next(middle);next = ngx_queue_next(next);if (next == ngx_queue_last(queue)) {//偶数个节点,在此返回后半个队列的第一个节点return middle;}next = ngx_queue_next(next);if (next == ngx_queue_last(queue)) {//奇数个节点,在此返回中间节点return middle;}}}

为什么该算法能够找到中间节点?

因害怕失败而不敢放手一搏,永远不会成功

学习,思考,记录,分享。

相关文章:

你感兴趣的文章:

标签云: