• Redis源码阅读-Adlist双向链表


      Redis源码阅读-链表部分-

    链表数据结构在Adlist.h   Adlist.c

    Redis的链表是双向链表,内部定义了一个迭代器。

    双向链表的函数主要是链表创建、删除、节点插入、头插入、尾插入、第N个节点、节点迭代遍历、链表复制、链表rotate、节点删除

    typedef struct listNode {
        struct listNode *prev;
        struct listNode *next;
        void *value; //定义为void *类型,方便用户自行使用自己的数据结构
    } listNode;
    
    typedef struct listIter {
        listNode *next;
        int direction;
    } listIter;
    
    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;
    
    /* Functions implemented as macros */
    #define listLength(l) ((l)->len)
    #define listFirst(l) ((l)->head)
    #define listLast(l) ((l)->tail)
    #define listPrevNode(n) ((n)->prev)
    #define listNextNode(n) ((n)->next)
    #define listNodeValue(n) ((n)->value)
    
    #define listSetDupMethod(l,m) ((l)->dup = (m))
    #define listSetFreeMethod(l,m) ((l)->free = (m))
    #define listSetMatchMethod(l,m) ((l)->match = (m))
    
    #define listGetDupMethod(l) ((l)->dup)
    #define listGetFree(l) ((l)->free)
    #define listGetMatchMethod(l) ((l)->match)
    
    /* Prototypes */
    /*创建链表*/
    list *listCreate(void);
    /*释放链表*/
    void listRelease(list *list);
    /*在头部添加节点*/
    list *listAddNodeHead(list *list, void *value);
    /*在尾部添加节点*/
    list *listAddNodeTail(list *list, void *value);
    /*在old_node的前面或者后面插入一个为value的节点*/
    list *listInsertNode(list *list, listNode *old_node, void *value, int after);
    /*在old_node的前面或者后面插入一个为value的节点*/
    void listDelNode(list *list, listNode *node);
    /*创建一个链表迭代器, direction代表迭代器的方向,向前或者向后*/
    listIter *listGetIterator(list *list, int direction);
    /*迭代器向下一个移动*/
    listNode *listNext(listIter *iter);
    /*释放链表迭代器*/
    void listReleaseIterator(listIter *iter);
    /*复制链表,返回复制后的链表*/
    list *listDup(list *orig);
    /*查找值为key的节点,如果定义了match函数,则使用match函数来比较key是否相等*/
    listNode *listSearchKey(list *list, void *key);
    /*返回链表第index个节点,index从0开始*/
    listNode *listIndex(list *list, long index);
    /*链表迭代器重置,指向头结点*/
    void listRewind(list *list, listIter *li);
    /*链表迭代器重置,指向尾结点*/
    void listRewindTail(list *list, listIter *li);
    
    /*链表的最后一个节点移到最前面, rotate*/
    void listRotate(list *list);
    
    /* Directions for iterators */
    /*迭代器方向:向后或者向前*/
    #define AL_START_HEAD 0
    #define AL_START_TAIL 1
  • 相关阅读:
    枚举
    交房租
    Schtasks 命令详解
    记录自己在 cmd 中执行 jar 文件遇到的一些错误
    Java 8 日期时间 API
    Java 8 Optional 类
    Java 8 Stream
    Java 8 默认方法
    Java 8 函数式接口
    Java 8 方法引用
  • 原文地址:https://www.cnblogs.com/stonehat/p/4855680.html
Copyright © 2020-2023  润新知