Linux内嵌链表(sys/queue.h)
简介
头文件 queue.h 为 C语言中的链表提供了更加标准规范的编程接口。如今的版本多为伯克利加州大学1994年8月的8.5版本。
queue.h 在 Linux 系统中的路径是 /usr/include/sys/queue.h
queue 分为 SLIST 、 LIST 、 STAILQ 、 TAILQ 、 CIRCLEQ 不同的链表有着不同的功能支持。 queue 的所有源码都是宏定义,因此完全包含于 queue.h 当中,无需编译为库文件。
每种结构都支持基本的操作:
- 在链表头插入节点
- 在任意的节点后插入节点
- 移除链表头后的节点
- 前向迭代遍历链表
区别
| 功能支持 | SLIST | LIST | STAILQ | TAILQ | CIRCLEQ |
| EMPTY | + | + | + | + | + |
| FIRST | + | + | + | + | + |
| NEXT | + | + | + | + | + |
| PREV | + | + | |||
| LAST | + | + | |||
| FOREACH | + | + | + | + | + |
| FOREACH_REVERSE | + | + | |||
| INSERT_HEAD | + | + | + | + | + |
| INSERT_BEFORE | + | + | + | ||
| INSERT_AFTER | + | + | + | + | + |
| INSERT_TAIL | + | + | + | ||
| CONCAT | + | + | |||
| REMOVE_HEAD | + | + | |||
| REMOVE | + | + | + | + | + |
| LOOP_NEXT | + | ||||
| LOOP_PREV | + |
SLIST
SLIST 是 Singly-linked List 的缩写,意为单向无尾链表。
SLIST 是最简单的结构,它适合数据量非常大而几乎不需要删除数据的场合,又或者当做堆栈使用。
STAILQ
STAILQ 是 Singly-linked Tail queue 的缩写,意为单向有尾链表。有尾链表可作队列使用。
有尾链表虽然为一些尾部操作提供了便捷的操作,但是可执行文件比无尾链表增加了约15%的大小,且牺牲了约20%的执行速度。
LIST
LIST 是双向无尾链表。
双向链表有前向的指针,因此可以执行一些前向操作,而且无需遍历链表便可以删除一些节点。
TAILQ
TAILQ 是 Tail queue 的缩写,意为双向有尾链表。有尾链表可作队列使用。
双向有尾链表兼具了双向链表和有尾链表的特点。
CIRCLEQ
CIRCLEQ 是 Circular queue 的缩写,意为循环链表。