Redis源码分析-基础功能(链表)

Redis链表中有三种基础的数据结构:

1.node

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;

} listNode;

表示当前链表中各节点的基础组成。prev表示前向指针,next表示后向指针,value指节点的值。

2.Iterator

typedef struct listIter {
    listNode *next;
    int direction;

} listIter;

表示当前列表的迭代器,next指当前节点,direction指迭代的方向。

3.list

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;

表示当前列表,head为头结点,tail尾节点,*(*dup)(void *ptr)为节点复制操作,(*free)(void *ptr)为节点释放操作,

(*match)(void *ptr, void *key)节点匹配操作,len节点长度。

Redis链表功能

1.list *listCreate(void); 创建链表。

2.void listRelease(list *list);   释放整个链表。

3.list *listAddNodeHead(list *list, void *value);  在链表头结点前加节点,作为新的头结点。

4.list *listAddNodeTail(list *list, void *value) ; 在链表尾节点后加节点,作为新的尾节点。

5.list *listInsertNode(list *list, listNode *old_node, void *value, int after) ;在链表中添加节点,old_node指要添加节点的附近节点,after如果不为0表示要在old_node 后面追加节点,after如果为0表示要在old_node前面追加节点。

6.listDelNode; 删除节点。

7.listIter *listGetIterator(list *list, int direction); 其中direction如果为0表示从头开始迭代,direction如果为1表示从尾部开始迭代。

8.void listReleaseIterator(listIter *iter) 释放迭代器内存。

9.void listRewind(list *list, listIter *li) 重置当前迭代器在链表头,迭代方向为从头开始迭代。

10.void listRewindTail(list *list, listIter *li) 重置当前迭代器在链表尾,迭代方向为从尾开始迭代。

11.listNode *listNext(listIter *iter) 查找当前节点的下一个节点,方向是迭代器定义好的方向。

12.list *listDup(list *orig) 赋值当前整个链表,如果查过内存,返回null。

13.listNode *listSearchKey(list *list, void *key) 。从链表头开始遍历,返回value值为key的节点。

14.listNode *listIndex(list *list, long index)  如果index>0,表示从头开始遍历,1表示头结点的下一个节点,如果index<0,表示从链表尾开始,想前遍历。-1表示尾节点,-2是尾节点的前一个节点。index越界会返回null。

15.void listRotate(list *list) 将链表的尾节点放在链表的头结点处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值