Redis源码(3):链表
概述
链表是一种比较基础的数据结构,主要在插入和删除时效率较高。Redis实现的是双向链表。
数据结构
listNode是链表的节点,有头指针和尾指针1
2
3
4
5typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
list是链表结构,有链表头、尾节点和链表长度属性,还有3个函数。1
2
3
4
5
6
7
8typedef struct list {
listNode *head;
listNode *tail;
void *(*dup)(void *ptr);
void (*free)(void *ptr);
int (*match)(void *ptr, void *key);
unsigned long len;
} list;
函数
创建 listCreate
1 | list *listCreate(void) |
拷贝 listDup
1 | list *listDup(list *orig) |
其它函数
- list *listCreate(void); 创建空链表
- void listRelease(list *list); 释放链表
- void listEmpty(list *list); 清空链表
- list listAddNodeHead(list list, void *value); 链表头添加节点
- list listAddNodeTail(list list, void *value); 链表尾添加节点
- list listInsertNode(list list, listNode old_node, void value, int after); 链表中插入节点
- void listDelNode(list list, listNode node); 删除节点
- listIter listGetIterator(list list, int direction); 获得链表迭代器
- listNode listNext(listIter iter); 下一个节点
- void listReleaseIterator(listIter *iter); 释放迭代器
- list listDup(list orig); 拷贝链表
- listNode listSearchKey(list list, void *key); 根据key查找节点
- listNode listIndex(list list, long index); 根据index获取节点
- void listRewind(list list, listIter li); 生成迭代器
- void listRewindTail(list list, listIter li); 生成尾迭代器
- void listRotate(list *list); 尾节点转为头节点
- void listJoin(list l, list o); 链表连接