【Nginx源码剖析-数据结构】双向链表(queue)【未完】
2017-05-17 17:12
337 查看
Nginx的双向链表
一、双向链表的主要作用
链表是一种顺序容器,其主要优势在于可以高效的插入、删除、分割、合并。在对链表进行移动时,不需要过多的操作,只需要修改指针域的指向。
双向链表是链表的加强版本,优势在于优化了单项链表向前操作时的问题。
二、适用范围
适用于频繁的对容器元素数量进行增删的场合三、源码位置
src/core/ngx_queue.csrc/core/ngx_queue.h
四、Nginx中的数据结构
Nginx双向链表的实现类似Linux内核,只实现了指针域,没有实现data域,具体定义及实现如下:/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include <ngx_core.h> #ifndef _NGX_QUEUE_H_INCLUDED_ #define _NGX_QUEUE_H_INCLUDED_ 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 // 检测链表h是否为空,是空返回0,不是返回1 #define ngx_queue_empty(h) \ (h == (h)->prev) // 将元素x插入链表h的头部 #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 *)); #endif /* _NGX_QUEUE_H_INCLUDED_ */
相关文章推荐
- 菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t
- 菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)
- 菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- nginx源码剖析---队列结构ngx_queue_t
- nginx高级数据结构源码分析(一)-----双向链表
- nginx 源码学习(四) 基本数据结构 ngx_queue_t
- 菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t
- nginx源码初读(7)--让烦恼从数据结构开始(ngx_queue)
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t
- nginx源码剖析(三) —— ngx_queue_t分析
- 数据结构---nginx-1.7.12源码分析 (双向链表)
- 菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)
- Nginx源码学习-双向链表(ngx_queue_t)实现及实例分析
- 【Nginx源码剖析-数据结构】数据结构梳理
- Nginx源码剖析之内存池,与内存管理
- nginx 源码学习笔记(九)——基本容器——queue
- 【内存池系列】Nginx源码剖析之内存池,与内存管理
- Nginx源码剖析之内存池,与内存管理 .