sys/queue.h分析
来源:互联网 发布:laravel 阿里云邮箱 编辑:程序博客网 时间:2024/05/01 23:27
[转自:@astrotycoon](http://blog.csdn.net/astrotycoon/article/details/42917367)
这两天有兴趣学习使用了下系统头文件sys/queue.h中的链表/队列的实现,感觉实现的很是优美,关键是以后再也不需要自己实现这些基本的数据结构了,哈哈!
我的系统环境是
正好需要使用队列,那么本篇就以其中的尾队列(tail queue)为例,结合实际的测试程序和示意图(亿图软件)来说明。
测试程序tailq.c如下:
我们首先来看一下这个尾队列的定义:
注意,其中的tqe_prev指向的不是前一个元素,而是前一个元素中的tqe_next,这样定义的一个好处就是*tqe_prev就是自身的地址,**tqe_prev就是自身。
好,现在就顺着我的测试程序来一步步看如何使用这个尾队列吧!
第一步是初始化步骤。关于初始化我们有两种方法:使用宏TAILQ_HEAD_INITIALIZER或者使用宏TAILQ_INIT,这两者都是可以的,唯一的区别是传递给宏TAILQ_INIT的是地址,而传递给宏TAILQ_HEAD_INITIALIZER的不是,这点需要引起我们的注意。
初始化后的数据结构怎样的呢? 我们看下示意图:
接下来的两个步骤(步奏2和步奏3)都是在这个队列的尾部追加元素(data1和data2),使用的是宏TAILQ_INSERT_TAIL:
那么队列的变化过程是这样的,请看示意图:
接下来的操作是在data1之前插入data3,使用的是宏TAILQ_INSERT_AFTER:
形象的示意图如下:
整理后的示意图如下:
紧接着的操作是在data2之前插入data4,使用的是宏TAILQ_INSERT_BEFORE:
形象的示意图如下:
整理后的示意图如下:
现在在队列首部插入data5,使用的是宏TAILQ_INSERT_HEAD:
形象的示意图如下:
整理后的示意图如下:
删除数据data5使用是宏TAILQ_REMOVE:
现在的队列布局如下:
好了,基本的操作就这么多,接下来我们看看提供的几个数据元素访问方法:
前三个很简单,一看就懂,我们重点分析下TAILQ_LAST和TAILQ_PREV。
TAILQ_LAST的目的是获取队列中的最后一个元素的地址,注意是地址哦!(head)->tqh_last代表的是最后一个元素中tqe_next的地址,通过强转之后,((struct headname *)((head)->tqh_last))->tqh_last实际上就是最后一个元素中的tqe_prev,而文章一开始介绍定义的时候就说过,*tqe_prev代表的是自身元素的地址,所以TAILQ_LAST最后获取的就是最后一个元素的地址,宏TAILQ_PREV的道理是一样的。
OK,测试程序接下来就是遍历整个队列,并打印出数据,可以使用提供的宏TAILQ_FOREACH,也可以使用上述的几个访问方法来遍历。
好了,其实本文没啥内容,对我个人而言就主要是想熟悉下亿图这个软件,哈哈
参考链接:
《queue.h之尾队列》
《关于libevent与FreeBSD内核中TAILQ队列的理解》
《深入理解FreeBSD中的TAILQ》
《libevent源码分析-- queue.h中TAILQ_QUEUE的理解》
《queue.h(Circular queue 循环队列) 》
《libevent源码之TAILQ详解》
《 QEMU代码中的QLIST》
《Libevent源码分析-----TAILQ_QUEUE队列》
- sys/queue.h分析
- sys/queue.h分析
- sys/queue.h分析
- sys/queue.h
- sys/queue.h
- sys/queue.h
- Sys.h源代码分析
- How to use list from sys/queue.h?
- sys-queue.h源码——参考实现stack
- Linux queue.h之TAILQ队列分析!
- Linux queue.h之TAILQ队列分析
- Linux queue.h之TAILQ队列分析
- queue.h
- Queue.h
- libevent源码分析-- queue.h中TAILQ_QUEUE的理解
- sys/timeb.h
- include/sys/dir.h
- sys/time.h
- 图片的三级缓存原理代码
- Qt中菜单创建及自定义数据类型与QVariant互转
- “GCC连接静态库成功,G++连接静态库不成功”的解决方法
- Java 截取反斜杠--java使用split拆分特殊字符
- Android中如何显示和隐藏键盘
- sys/queue.h分析
- HDU 1498 50 years, 50 colors
- HDOJ -- 2544最短路
- uvalive3211+uvalive3713
- E-最小生成树
- 【leetcode】328. Odd Even Linked List
- 批处理处理apk或者jar包
- AsyncTask中的线程池
- maven数据绑定一