redis的list 实现在如下路径中
E:\redis-3.0-annotated-unstable\redis-3.0-annotated-unstable\src\adlist.h
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;
可以看到list 包含了一个listNode ,其中又包含前向和后向节点的指针,以及本节点的值value,注意这个这里void是void类型,可以保存任何类型的指针
在list中有包含三个函数指针,分别由于duplicate/free/match ,以及list的长度len,从list 的定义可以知道除了普通list操作外,还支持三个函数指针的操作
这里特别注意求链表长度时不用遍历整个list,只要返回成员变量len就行.
例如下面的函数用于求取list的长度
#define listLength(l) ((l)->len)
// 将链表 l 的值复制函数设置为 m
#define listSetDupMethod(l,m) ((l)->dup = (m))
// 将链表 l 的值释放函数设置为 m
#define listSetFreeMethod(l,m) ((l)->free = (m))
// 将链表的对比函数设置为 m
#define listSetMatchMethod(l,m) ((l)->match = (m))
listcreate 用于新建一个新的list
list *listCreate(void)
{
struct list *list;
// 分配内存
if ((list = zmalloc(sizeof(*list))) == NULL)
return NULL;
// 初始化属性
list->head = list->tail = NULL;
list->len = 0;
list->dup = NULL;
list->free = NULL;
list->match = NULL;
return list;
}
listDup 用于复制整个list,其中会用到list的dup这个函数指针
list *listDup(list *orig)
{
list *copy;
listIter *iter;
listNode *node;
// 调用listcreat新建一个list,listCreate失败的话会返回null,整个函数也就返回null了
if ((copy = listCreate()) == NULL)
return NULL;
//用新list的三个函数指针指向原来list的三个函数指针
copy->dup = orig->dup;
copy->free = orig->free;
copy->match = orig->match;
// 得到一个迭代器准备迭代整个list
iter = listGetIterator(orig, AL_START_HEAD);
while((node = listNext(iter)) != NULL) {
void *value;
//如果dup不为null,则调用dup将元节点的value赋值给新节点,从这里知道如果dup 不为null,则节点值value 一般指向一片内存,而不是
// 一个简单的值,如果dup 失败返回null,则返回NULL
if (copy->dup) {
value = copy->dup(node->value);
if (value == NULL) {
listRelease(copy);
listReleaseIterator(iter);
return NULL;
}
} else
#这个值是一个简单的值。
value = node->value;
// 将新的节点value添加到copy 的后面
if (listAddNodeTail(copy, value) == NULL) {
listRelease(copy);
listReleaseIterator(iter);
return NULL;
}
}
// 释放迭代器
listReleaseIterator(iter);
// 返回新建的list,也就是原本list orig的副本
return copy;
}
redis中的list
最新推荐文章于 2024-09-22 12:56:24 发布