redis源码阅读--二-链表

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation

参考书籍:《redis的设计与实现》
文章推荐:
redis源码阅读-一--sds简单动态字符串
redis源码阅读--二-链表
redis源码阅读--三-redis散列表的实现
redis源码浅析--四-redis跳跃表的实现
redis源码浅析--五-整数集合的实现
redis源码浅析--六-压缩列表
redis源码浅析--七-redisObject对象(下)(内存回收、共享)
redis源码浅析--八-数据库的实现
redis源码浅析--九-RDB持久化
redis源码浅析--十-AOF(append only file)持久化
redis源码浅析--十一.事件(上)文件事件
redis源码浅析--十一.事件(下)时间事件
redis源码浅析--十二.单机数据库的实现-客户端
redis源码浅析--十三.单机数据库的实现-服务端 - 时间事件
redis源码浅析--十三.单机数据库的实现-服务端 - redis服务器的初始化
redis源码浅析--十四.多机数据库的实现(一)--新老版本复制功能的区别与实现原理
redis源码浅析--十四.多机数据库的实现(二)--复制的实现SLAVEOF、PSYNY
redis源码浅析--十五.哨兵sentinel的设计与实现
redis源码浅析--十六.cluster集群的设计与实现
redis源码浅析--十七.发布与订阅的实现
redis源码浅析--十八.事务的实现
redis源码浅析--十九.排序的实现
redis源码浅析--二十.BIT MAP的实现
redis源码浅析--二十一.慢查询日志的实现
redis源码浅析--二十二.监视器的实现

一 数据结构的定义

/* Node, List, and Iterator are the only data structures used currently. */

typedef struct listNode {
    struct listNode *prev;//前置节点
    struct listNode *next;//后置节点
    void *value; //节点值
} listNode;

//list用来持有链表 
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;

链表的结构如下图:

 

 

二.链表的API

链表相对比较简单,下边是adlist.h对链表api的定义

/* Prototypes */
list *listCreate(void); //创建一个不包含节点的空链表
void listRelease(list *list); //释放链表以及他的节点
void listEmpty(list *list); //只释放链表中的节点
list *listAddNodeHead(list *list, void *value);//从头部插入一个节点
list *listAddNodeTail(list *list, void *value);//从尾部插入一个节点
//从old_node节点插入一个值,after参数:是从old_node节点前插入还是后插入
list *listInsertNode(list *list, listNode *old_node, void *value, int after); 
void listDelNode(list *list, listNode *node); //删除节点
listIter *listGetIterator(list *list, int direction); //获取个节点的迭代器
listNode *listNext(listIter *iter); //获取节点的下一节点 ,iter觉得方向,从头部还是从尾部
void listReleaseIterator(listIter *iter);//释放迭代器
list *listDup(list *orig); //复制的链表
listNode *listSearchKey(list *list, void *key); //搜索节点
listNode *listIndex(list *list, long index); //
void listRewind(list *list, listIter *li); //重置迭代器 到头部
void listRewindTail(list *list, listIter *li);//重置迭代器 到尾部
void listRotate(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、付费专栏及课程。

余额充值