Redis源码整理笔记:adlist与个人理解

adlist采用双向链表的形式

list 列表定义

// 定义list列表
typedef struct list {
    listNode *head;					    // list列表的头节点
    listNode *tail;						// list列表的尾节点
    // dup、free、match 均用于回调使用
    void *(*dup)(void *ptr);			// 复制函数指针
    void (*free)(void *ptr);			// 释放函数指针
    int (*match)(void *ptr, void *key); // 匹配函数指针
    unsigned long len;					// list列表的长度
} list;

list 迭代器

// list 迭代器,单向
typedef struct listIter {
    listNode *next;		// 当前迭代器的下一个元素
    int direction;		// 迭代器的方向
} listIter;

listNode节点

// 定义listNode节点
typedef struct listNode {    
    struct listNode *prev;          // 前一节点    
    struct listNode *next;    		// 后一节点    
    void *value;					// node的值,此处是指函数指针    
} listNode;

adlist 常用的方法

// 宏定义的一些操作
#define listLength(l) ((l)->len)    	// list长度
#define listFirst(l) ((l)->head)     	// 获取list 头部
#define listLast(l) ((l)->tail)     	// 获取list 尾部
#define listPrevNode(n) ((n)->prev)     // 获取某节点的上一个节点
#define listNextNode(n) ((n)->next)     // 获取某节点下一个节点
#define listNodeValue(n) ((n)->value)   // 获取某节点的值,对应的是个函数指针

// 分别设置和获取dup、free、match
#define listSetDupMethod(l,m) ((l)->dup = (m))      // list的复制函数的设置
#define listSetFreeMethod(l,m) ((l)->free = (m))    // list的释放函数的设置
#define listSetMatchMethod(l,m) ((l)->match = (m))  // list的匹配函数的设置

#define listGetDupMethod(l) ((l)->dup)              // list的复制函数的获取
#define listGetFree(l) ((l)->free)                  // list的释放函数的获取
#define listGetMatchMethod(l) ((l)->match)          // list的释放函数的获取

/* Prototypes */
// 方法原型
list *listCreate(void);                             //创建一个list列表
void listRelease(list *list);                       // 释放一个list
void listEmpty(list *list);                         // 将list置空
list *listAddNodeHead(list *list, void *value);     // 在list头部添加节点
list *listAddNodeTail(list *list, void *value);     // 在list尾部添加节点
// 在list某个节点后面插入节点
list *listInsertNode(list *list, listNode *old_node, void *value, int after); 
void listDelNode(list *list, listNode *node);          // 删除指定节点
listIter *listGetIterator(list *list, int direction);  // 获取list的迭代器
listNode *listNext(listIter *iter);                    // 利用list迭代器获取的下一个节点
void listReleaseIterator(listIter *iter);              // 释放list迭代器
list *listDup(list *orig);                             // 列表的复制
listNode *listSearchKey(list *list, void *key);        // 在list列表中查找某个值对应的节点
listNode *listIndex(list *list, long index);           // 获取list列表中某个位置的节点
void listRewind(list *list, listIter *li);             // 重置迭代器方向从头部开始
void listRewindTail(list *list, listIter *li);         // 重置迭代器方向从尾部开始
void listRotate(list *list);                           // list 翻转
void listJoin(list *l, list *o);                       // 将o 列表对应的节点插入到l 列表中

/* Directions for iterators */
// 宏定义 迭代器的方向 0:从头部向尾部,1:从尾部向头部
#define AL_START_HEAD 0
#define AL_START_TAIL 1

#endif /* __ADLIST_H__ */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值