redis源码学习--数据结构:链表

redis源码学习–数据结构之链表

redis中的链表介绍

redis中使用的是双向链表,定义在目录src\adlist.c中,结构体定义在同名的头文件中。
src\adlist.c封装了链表的API

在节点的基础上再封装了一层,定义了链表对象,除了指向链表首尾的指针,还声明了拷贝、清理内存和匹配的接口。这些接口都可以根据具体的链表具体定义。

// 节点的定义
typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

// 链表的定义
typedef struct list {
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned long len;
} list;

定义了迭代器,非常实用:

typedef struct listIter {
    // 当前迭代到的节点
    listNode *next;
    // 迭代的方向
    int direction; //取值AL_START_HEAD等
} listIter;

下面介绍下拷贝链表操作来说明引入迭代器的便利:

list *listDup(list *orig)
{
    list *copy;
    listIter iter;
    listNode *node;

    if ((copy = listCreate()) == NULL)
        return NULL;
    copy->dup = orig->dup;
    copy->free = orig->free;
    copy->match = orig->match;
    listRewind(orig, &iter); // 使用迭代器指向链表头
    while((node = listNext(&iter)) != NULL) { // 检查是否到达链表尾
        void *value;

        if (copy->dup) {
            value = copy->dup(node->value); // 使用自定义的拷贝函数拷贝节点内存
            if (value == NULL) {
                listRelease(copy);
                return NULL;
            }
        } else
            value = node->value;
        if (listAddNodeTail(copy, value) == NULL) {
            listRelease(copy);
            return NULL;
        }
    }
    return copy;
}

void listRewind(list *list, listIter *li) {
    li->next = list->head;
    li->direction = AL_START_HEAD;
}

listNode *listNext(listIter *iter)
{
    listNode *current = iter->next;

    if (current != NULL) {
        if (iter->direction == AL_START_HEAD)
            iter->next = current->next;
        else
            iter->next = current->prev;
    }
    return current;
}

总结:

  1. redis使用的是双向链表,表头结构声明了拷贝,释放,匹配三种方式,
  2. 引入了迭代器的定义,值得学习。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值