1. 链表和链表节点的实现
每个链表节点使用一个adlist.h/listNode结构来表示
/*
* 链表节点
*/
typedef struct listNode {
// 前驱节点
struct listNode *prev;
// 后继节点
struct listNode *next;
// 值
void *value;
} listNode;
使用adlist.h/list来持有链表
/*
* 链表
*/
typedef struct list {
// 表头指针
listNode *head;
// 表尾指针
listNode *tail;
// 节点数量
unsigned long len;
// 复制函数
void *(*dup)(void *ptr);
// 释放函数
void (*free)(void *ptr);
// 比对函数
int (*match)(void *ptr, void *key);
} list;
Redis链表特性:
- 双端
- 无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点
- 带表头指针和表尾指针
- 带链表长度计数器
- 多态:链表节点使用void *指针来保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值
2. 链表和链表节点的API
listSetDupMethod
listGetDupMethod
listSetFreeMethod
listGetFreeMethod
listSetMatchMethod
listGetMatchMethod
listLength
listFirst
listLast
listPreNode
listNextNode
listNodeValue
listCreate
listAddNodeHead
listAddNodeTail
listInsertNode
listSearchKey
listIndex
listDelNode
listRotate 将链表的表尾节点弹出,然后将被弹出的节点插入到链表的表头,成为新的表头节点
listDup 复制一个给定链表的副本
listRelease 释放给定链表,以及链表中的所有节点