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 释放给定链表,以及链表中的所有节点
338

被折叠的 条评论
为什么被折叠?



