redis 源码解析 双向链表-adlist(6.2.3版本)

adlist,双向链表,相对比较简单的结构体。

       节点指针定义为void* value 就是为了能够通用,有用户定义自己的结构体模型,该指针只用指向malloc的指针地址即可;

双向链表结构体中的指针函数,也只是为了方便用户自定义进行释放,比较,复制。

在实际使用中,可以根据需要扩展双向链表的查询。

双向链表比较简单,《数据结构》中有关于链表的详细介绍,这里只列出定义的结构体和函数的相关注释说明。

//双向链表结构体
typedef struct listNode {//list节点
    struct listNode *prev;//前一个节点
    struct listNode *next;//下一个节点
    void *value;//节点值指针
} listNode;

typedef struct listIter {//迭代器
    listNode *next;//AL_START_HEAD next指向 head, AL_START_TAIL指向tail
    int direction;//节点方向,AL_START_HEAD,AL_START_TAIL
} listIter;

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;


//创建双向链表list
list *listCreate(void);

//释放双向链表list
void listRelease(list *list);

//清空双向链表,置位空链表,但是链表结构体还存在,释放需要调用listRelease
void listEmpty(list *list);

//头插入
list *listAddNodeHead(list *list, void *value);

//尾插入
list *listAddNodeTail(list *list, void *value);

//在指定节点前/后插入一个节点
//after 为true,插入指定节点后面, false,插入前面
list *listInsertNode(list *list, listNode *old_node, void *value, int after);

//删除节点
void listDelNode(list *list, listNode *node);

//获取节点迭代器  根据方向获取,AL_START_HEAD next指向 head, AL_START_TAIL指向tail
listIter *listGetIterator(list *list, int direction);

//获取迭代器的下一个节点
listNode *listNext(listIter *iter);

//释放迭代器节点
void listReleaseIterator(listIter *iter);

//链表复制
list *listDup(list *orig);

//查找key值节点
listNode *listSearchKey(list *list, void *key);

//获取具体位置的节点,head为0, 下一个为1,上一个为-1,依次类推
listNode *listIndex(list *list, long index);

//获取头节点的迭代器
void listRewind(list *list, listIter *li);

//获取尾节点的迭代器
void listRewindTail(list *list, listIter *li);

//尾节点置位头节点
void listRotateTailToHead(list *list);

//头节点置位尾节点
void listRotateHeadToTail(list *list);

//两个链表连接
void listJoin(list *l, list *o);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值