【问题标题】:glibc - list and other data structures implementationsglibc - 列表和其他数据结构实现
【发布时间】:2013-05-25 01:39:09
【问题描述】:

我觉得我的谷歌搜索技能现在很差,在 glibc 中找不到列表实现,找到了 hashtree 实现但不是列表之一。

是否有任何 glibc 实现?我不想重新格式化 linux kernel linked list 宏并在用户空间中使用它们。

【问题讨论】:

    标签: c linux list glibc


    【解决方案1】:

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

    【讨论】:

    • 不,它是一个 C API。如果是这样,那就太奇怪了。
    • 我以前怎么不知道这些功能呢?为什么search.h 定义struct qelem 结构并带有尾随char q_data[1]; 元素?这使得该定义对于嵌入用户结构的用处不大,并且没有任何我能想到的好处(所以我一定遗漏了一些东西,对吧?)。
    • @MichaelBurr,我猜是旧的实现。 POSIX description 在“应用程序使用”部分中有更多详细信息。
    【解决方案2】:

    /usr/include/sys/queue.h 包含各种链表变体。(比man page 文档更多)

    以下是 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多