redis 的链表实现不是很复杂,从 listNode
可以知道,list
是一个双向链表,支持从链表首尾两边开始遍历结点。同时提供了 listIter
迭代器,方便前后方向迭代遍历。其它应该就是链表增删改查的一些常规操作了。
1. 文件
adlist.h, adlist.c
2. 数据结构
2.1. 链表结点
1
2
3
4
5
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
2.2. 链表迭代器
1
2
3
4
typedef struct listIter {
listNode *next;
int direction;
} listIter;
2.3. 链表
1
2
3
4
5
6
7
8
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;