【问题标题】:How to use list from sys/queue.h?如何使用 sys/queue.h 中的列表?
【发布时间】:2011-10-02 14:58:14
【问题描述】:

目前,我已经实现了一个单链表,如下所示:

struct PeerNode {
     struct Peer* cargo;
     struct PeerNode* next;
};

...我有一个包含几个这样的链表的结构,如下所示:

struct Torrent {
     ...
     struct PeerNode* peer_list;
     struct PeerNode* unchoked_peers;
     ...
}

我想使用sys/queue.h 提供的宏来替换它。我收集到我可以用这样的东西替换我的代码:

struct Torrent {
     ...
     LIST_ENTRY(PeerNode, Peer) peer_list;
     struct PeerNode* unchoked_peers;
     ...
}

然后,通过查看man queue,我相信我会通过执行以下操作来初始化列表:

LIST_INIT(&peer_list);
LIST_INIT(unchoked_peers);

但是,我不明白LIST_ENTRY 如何影响列表的使用。在man 页面上,它说:“宏LIST_ENTRY 声明了一个连接列表中元素的结构”,但我真的不明白这是什么意思。

为什么要声明一个结构来连接列表中的元素?每个节点不应该像我最初的链表实现那样通过指针连接到下一个节点吗?如何用sys/queue.h 提供的实现替换我的链接列表?如何在列表中插入元素?

【问题讨论】:

    标签: c linux list bsd


    【解决方案1】:

    LIST_ENTRY 创建字段以放入适合链接元素的结构中,因此您不必关心这些指针的细节。

    struct foo {
        int a, b, c;
        /* This is instead of "struct foo *next" */
        LIST_ENTRY(foo) pointers;
    };
    

    然后创建一个您将使用 LIST_HEAD() 的列表:

    struct Torrent {
        LIST_HEAD(foo_list, foo) bar;
    };
    

    您可以使用 LIST_INIT() 初始化列表标题:

    struct Torrent t;
    LIST_INIT(&t.bar);
    

    您可以使用 LIST_INSERT_*() 宏插入元素:

    struct foo *item = malloc(sizeof(struct foo));
    LIST_INSERT_HEAD(&t.bar, item, pointers);
    

    这一切都取自http://www.manpagez.com/man/3/queue/手册页中的列表示例

    举个完整的例子: http://infnis.wikidot.com/list-from-sys-queue-h

    【讨论】:

    • 嗨,我正在寻找基于<sys/queue.h> 的队列综合使用示例,示例链接似乎不再有效.. 也许您有备用链接?
    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 2014-04-14
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多