【ZMQ源码阅读】数据结构之单向链表zlist

这篇博客详细介绍了ZMQ中单向链表zlist的数据结构,包括比较函数指针、析构函数指针、节点和链表的定义。同时,还探讨了链表的各种操作,如创建、销毁、访问元素、添加、删除、查找、复制、清理、排序等。博主赞赏zlist设计的灵活性,允许用户自定义比较和析构功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据结构定义

1.1 比较函数指针

//比较函数指针
typedef int (zlist_compare_fn) (
    void *item1, void *item2);

1.2 析构函数指针

//析构函数指针
typedef void (zlist_free_fn) (
    void *data);

1.3 节点

//节点定义
typedef struct _node_t {
    struct _node_t *next;    // 指向下一个节点
    void *item;              // 节点当中的元素
    zlist_free_fn *free_fn;  // 元素对应的析构函数
} node_t;

1.4 链表

//链表定义
struct _zlist_t {

    node_t *head;                 // 头节点

    node_t *tail;                 // 尾节点

    node_t *cursor;               // 当前访问节点

    size_t size;                  // 元素数量

    bool autofree;                // 如果为真,使用默认析构元素,否则使用节点自带的析构

    zlist_compare_fn *compare_fn; // 自定义的比较函数回调,用来比较两个元素

};

 

二、函数定义

2.1 创建链表对象

//创建链表对象
zlist_t *
zlist_new (void)
{
    zlist_t *self = (zlist_t *) zmalloc (sizeof (zlist_t));
    assert (self);
    return self;
}

2.2 销毁链表对象

void
zlist_destroy (zlist_t **self_p)
{
    assert (self_p);
    if (*self_p) {
        zlist_t *self = *self_p;
        zlist_purge (self);
        freen (self);
        *self_p = NULL;
    }
}

2.3 访问链表第1个元素

void *
zlist_first (zlist_t *self)
{
    assert (self);
    //将游标移动到链首位置
    self->cursor = self->head;
    //返回链首元素
    if (self->cursor)
        return self->cursor->item;
    else
        return NULL;
}

2.4 访问链表下一个元素

void *
zlist_next (zlist_t *self)
{
    assert (self);
    //将游标移动到下一个,如果是首次访问,那么设置为首节点
    if (self->cursor)
        self->cursor = self->cursor->next;
    else
        self->cursor = self->head;
    //如果当前游标非空,那么返回里面的元素
    if (self->cu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值