每个链表接点使用一个adlist.h/listNode结构表示:
typedef struce listNode {
//前置节点
struct listNode *prev;
//后置节点
struct listNode *next;
//节点的值
void *value;
}listNode;
多个listNode可以通过prev和next指针组成双端链表。
使用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的脸表实现特点可以总结:
1、双端:链表节点带有prev和next指针;
2、无环:表头节点的prev与表尾节点的next只想NULL;
3、带表头指针和表尾指针:list机构的head和tail指针;
4、带有链表长度计数器:len
5、多态:链表可以保存各种不同类型的值。