ngx_queue_t
来源:互联网 发布:网络小额贷款平台 编辑:程序博客网 时间:2024/05/24 03:17
#include <stdio.h>typedef __u_char u_char;typedef intptr_t ngx_int_t;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) \ (q)->prev = q; \ (q)->next = q#define ngx_queue_empty(h) \ (h == (h)->prev)#define ngx_queue_insert_head(h, x) \ (x)->next = (h)->next; \ (x)->next->prev = x; \ (x)->prev = h; \ (h)->next = x#define ngx_queue_insert_after ngx_queue_insert_head#define ngx_queue_insert_tail(h, x) \ (x)->prev = (h)->prev; \ (x)->prev->next = x; \ (x)->next = h; \ (h)->prev = x#define ngx_queue_head(h) \ (h)->next#define ngx_queue_last(h) \ (h)->prev#define ngx_queue_sentinel(h) \ (h)#define ngx_queue_next(q) \ (q)->next#define ngx_queue_prev(q) \ (q)->prev#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#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;#define ngx_queue_add(h, n) \ (h)->prev->next = (n)->next; \ (n)->next->prev = (h)->prev; \ (h)->prev = (n)->prev; \ (h)->prev->next = h;#define ngx_queue_data(q, type, link) \ (type *) ((u_char *) q - offsetof(type, link))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双向链表的例子typedef struct _tagTestNode{u_char* str;ngx_queue_t qEle;int num;}TestNode;ngx_int_t compTestNode(const ngx_queue_t* a, const ngx_queue_t* b){/*首先使用ngx_queue_data方法由ngx_queue_t变量获取元素结构体TestNode的地址*/TestNode* aNode = ngx_queue_data(a, TestNode, qEle);TestNode* bNode = ngx_queue_data(b, TestNode, qEle);//返回num成员的比较结果return (aNode->num) > (bNode->num);}int main(){ngx_queue_t queueContainer;ngx_queue_init(queueContainer);int i = 0;TestNode node[5];for(; i < 5; i++){node[i] = i+100;}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);ngx_queue_t *q;for(q = ngx_queue_head(&queueContainer); q != ngx_queue_sentinel(&queueContainer); q = ngx_queue_next(&queueContainer)){TestNode *eleNode = ngx_queue_data(q, TestNode, qEle);printf("eleNode->num=%d\n", eleNode->num);}ngx_queue_sort(&queueContainer, compTestNode);for(q = ngx_queue_head(&queueContainer); q != ngx_queue_sentinel(&queueContainer); q = ngx_queue_next(&queueContainer)){TestNode *eleNode = ngx_queue_data(q, TestNode, qEle);printf("eleNode->num=%d\n", eleNode->num);}return 0;}
0 0
- ngx_queue_t
- ngx_queue_t
- Nginx 数据结构 ngx_queue_t
- ngx_queue_t双向链表
- nginx数据结构ngx_queue_t
- Nginx基本数据结构之ngx_queue_t
- nginx双向链表ngx_queue_t
- Nginx数据结构——ngx_queue_t
- Nginx源码分析之ngx_queue_t
- Nginx源码阅读(ngx_queue_t)
- nginx源码分析—队列结构ngx_queue_t
- Nginx源码分析---队列结构ngx_queue_t
- nginx源码分析—队列结构ngx_queue_t
- nginx源码分析—队列结构ngx_queue_t
- nginx 源码学习(四) 基本数据结构 ngx_queue_t
- ngx源码分析--数据结构 队列ngx_queue_t
- nginx双向队列ngx_queue_t使用例子
- Nginx 队列双向链表结构 ngx_queue_t
- 非常详细的 Docker 学习笔记
- LeedCode----169. Majority Element(M)
- LeetCode 7. Reverse Integer
- openVR驱动接口之IVRCameraComponent简介
- 三次握手和四次挥手
- ngx_queue_t
- openVR驱动接口之ICameraVideoSinkCallback简介
- html使用ajax+jsp更新网页部分信息
- python操作数据库之批量导入
- Linux内核分析(六):进程的描述和进程的创建
- cs231n一次课程实践,python实现softmax线性分类器和二层神经网络
- openVR驱动接口之IDriverLog简介
- 编程之法-第一章字符串
- Halcon学习(三) Halcon基本操作:获取时间与文本操作