glibc – list和其他数据结构实现

我填充像我的谷歌search技能现在很差,无法find在glibc中的列表实现,发现哈希和树实现,但不是一个列表之一。

有没有glibc实现呢? 我不想重新格式化Linux内核链表macros,并在用户空间中使用它们。

Solutions Collecting From Web of "glibc – list和其他数据结构实现"

你可以使用insque(3)remque(3)

/usr/include/sys/queue.h其中包含各种链接列表变体(比手册页文档多)

下面是一个TAIL_QUEUE的例子:通过预处理器(gcc -E -c prog.c)运行它,以便更容易地看到它是如何工作的)

 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/queue.h> struct Block { char text[64]; //linked list entry TAILQ_ENTRY(Block) blocks; }; struct File { char name[128]; //list of blocks in the "file" TAILQ_HEAD(,Block) head; }; void add_block(struct File *f, const char *txt) { struct Block *b = malloc(sizeof *b); strcpy(b->text,txt); TAILQ_INSERT_TAIL(&f->head, b, blocks); } void print_file(struct File *f) { struct Block *b; printf("File: %s\n", f->name); TAILQ_FOREACH(b, &f->head, blocks) { printf("Block: %s\n", b->text); } } void delete_block(struct File *f, const char *txt) { struct Block *b, *next; for(b = TAILQ_FIRST(&f->head) ; b != NULL ; b = next) { next = TAILQ_NEXT(b, blocks); if(strcmp(b->text, txt) == 0) { TAILQ_REMOVE(&f->head, b, blocks); free(b); } } } void delete_all_blocks(struct File *f) { struct Block *b; while((b = TAILQ_FIRST(&f->head))) { TAILQ_REMOVE(&f->head, b, blocks); free(b); } } int main(void) { struct File f; TAILQ_INIT(&f.head); strcpy(f.name,"Test.f"); add_block(&f,"one"); add_block(&f,"two"); add_block(&f,"three"); print_file(&f); puts("\nDeleting three"); delete_block(&f, "three"); print_file(&f); puts("\nAdding 2 blocks"); add_block(&f,"three"); add_block(&f,"three"); print_file(&f); puts("\nDeleting three"); delete_block(&f, "three"); print_file(&f); delete_all_blocks(&f); return 0; }