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
的缩写,意为循环链表。