Redis 源码分析(二)adlist

ADLIST

list 只是普通的链表数据结构,在list结构中保存了dup、free、match三个函数指针用于对链表节点进行复制、释放、查找。 list

 1/* Prototypes */
 2/// 创建链表对象并初始化为一个空链表
 3list *listCreate(void);
 4/// 释放链表
 5void listRelease(list *list);
 6/// 移除所有链表对象
 7void listEmpty(list *list);
 8/// 在链表头加入数据,发生错误返回NULL
 9list *listAddNodeHead(list *list, void *value);
10/// 在链表尾加入数据,发生错误返回NULL
11list *listAddNodeTail(list *list, void *value);
12/// after != 0 在old_node节点前插入,否则在old_node后插入新节点。失败返回NULL
13list *listInsertNode(list *list, listNode *old_node, void *value, int after);
14/// 在链表中删除指定的节点
15void listDelNode(list *list, listNode *node);
16/// 获取链表迭代器,direction负责指出迭代器的方向:向前或者向后,内存分配失败返回NULL
17listIter *listGetIterator(list *list, int direction);
18/// 获取下一个链表节点,返回节点的指针。若已经到了链表末尾则返回NULL
19listNode *listNext(listIter *iter);
20/// 释放迭代器(内存)
21void listReleaseIterator(listIter *iter);
22/// 复制链表,若没有指定dup函数则复制value的值,任何错误都会返回NULL
23list *listDup(list *orig);
24/// 搜索链表,若指定了match函数则使用match函数搜索,否则仅比较value
25listNode *listSearchKey(list *list, void *key);
26/// 通过索引搜索链表,负值表示从链表尾部向头部搜索,例如-1表示链表的最后一个元素。
27listNode *listIndex(list *list, long index);
28/// 重置迭代器为向后遍历
29void listRewind(list *list, listIter *li);
30/// 重置迭代器为向前遍历
31void listRewindTail(list *list, listIter *li);
32/// 将最后一个元素移到链表头
33void listRotateTailToHead(list *list);
34/// 将第一个元素移到链表尾
35void listRotateHeadToTail(list *list);
36/// 把链表o的所有节点转移到链表l之后,转移后链表o变为空链表。此时不检查函数指针是否一致。
37void listJoin(list *l, list *o);

列表没什么好讲的,只是基本的数据类型封装

评论