INSQUE - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
insque,remque-从队列中插入/删除项目
语法
#include <search.h> void insque(void *elem, void *prev); void remque(void *elem);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
insque(),remque():
- _XOPEN_SOURCE>= 500 || / * Glibc自2.19起:* / -_DEFAULT_SOURCE || / * Glibc版本
说明
insque()和remque()函数可处理双向链接列表。列表中的每个元素都是前两个指针为前向和后向指针的结构。链接列表可以是线性的(即,列表末尾为NULL前向指针,列表开头为NULL后向指针)或圆形。
insque()函数在prev指向的元素之后立即插入elem指向的元素。
如果列表是线性的,则可以使用insque(elem,NULL)调用来插入初始列表元素,并且此调用将elem的前向和后向指针设置为NULL。
如果列表是循环的,则调用者应确保将第一个元素的前后指针初始化为指向该元素,并且insque()调用的prev参数也应指向该元素。
remque()函数从双向链接列表中删除elem指向的元素。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
| Interface | Attribute | Value |
| insque(),remque() | Thread safety | MT-Safe |
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
在古代系统上,这些函数的参数为struct qelem *类型,定义为:
struct qelem {
struct qelem *q_forw;
struct qelem *q_back;
char q_data[1];
};
如果在包括之前定义了_GNU_SOURCE,仍然会得到此结果。
这些功能的原型的位置在UNIX的多个版本中有所不同。以上是POSIX版本。有些系统将它们放入。
BUGS
在glibc 2.4和更低版本中,无法将prev指定为NULL。因此,要构建线性列表,调用者必须使用包含列表前两个元素的初始调用来构建列表,并适当初始化每个元素中的前向和后向指针。
示例
下面的程序演示了insque()的用法。这是该程序的示例运行:
$ ./a.out -c a b c
Traversing completed list:
a
b
c
That was a circular list
Program source
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <search.h>
struct element {
struct element *forward;
struct element *backward;
char *name;
};
static struct element *
new_element(void)
{
struct element *e;
e = malloc(sizeof(struct element));
if (e == NULL) {
fprintf(stderr, "malloc() failed\n");
exit(EXIT_FAILURE);
}
return e;
}
int
main(int argc, char *argv[])
{
struct element *first, *elem, *prev;
int circular, opt, errfnd;
/* The "-c" command-line option can be used to specify that the
list is circular */
errfnd = 0;
circular = 0;
while ((opt = getopt(argc, argv, "c")) != -1) {
switch (opt) {
case 'c':
circular = 1;
break;
default:
errfnd = 1;
break;
}
}
if (errfnd || optind >= argc) {
fprintf(stderr, "Usage: %s [-c] string...\n", argv[0]);
exit(EXIT_FAILURE);
}
/* Create first element and place it in the linked list */
elem = new_element();
first = elem;
elem->name = argv[optind];
if (circular) {
elem->forward = elem;
elem->backward = elem;
insque(elem, elem);
} else {
insque(elem, NULL);
}
/* Add remaining command-line arguments as list elements */
while (++optind < argc) {
prev = elem;
elem = new_element();
elem->name = argv[optind];
insque(elem, prev);
}
/* Traverse the list from the start, printing element names */
printf("Traversing completed list:\n");
elem = first;
do {
printf(" %s\n", elem->name);
elem = elem->forward;
} while (elem != NULL && elem != first);
if (elem == first)
printf("That was a circular list\n");
exit(EXIT_SUCCESS);
}
另外参见
队列(3)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。

