redis源码分析(adlist)

来源:互联网 发布:androidargb调色板源码 编辑:程序博客网 时间:2024/05/17 08:27
typedef struct listNode {    struct listNode *prev;    struct listNode *next;    void *value;} listNode;

首先定义了一个节点,包含前驱和后继以及对应的value

typedef struct listIter {    listNode *next;    int direction;} listIter;
list的迭代器,next指针和迭代方向

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指针分别指向收尾,另外三个函数指针代表在拷贝,删除,对比的时候,如果有函数可调用就调用当前次函数的逻辑,不然就调用自身的逻辑

/* Create a new list. The created list can be freed with * AlFreeList(), but private value of every node need to be freed * by the user before to call AlFreeList(). * * On error, NULL is returned. Otherwise the pointer to the new list. */list *listCreate(void){    struct list *list;    if ((list = zmalloc(sizeof(*list))) == NULL)        return NULL;    list->head = list->tail = NULL;    list->len = 0;    list->dup = NULL;    list->free = NULL;    list->match = NULL;    return list;}/* Free the whole list. * * This function can't fail. */void listRelease(list *list){    unsigned long len;    listNode *current, *next;    current = list->head;    len = list->len;    while(len--) {        next = current->next;        if (list->free) list->free(current->value);        zfree(current);        current = next;    }    zfree(list);}
创建和删除链表没什么说的


/* Add a new node to the list, to head, containing the specified 'value' * pointer as value. * * On error, NULL is returned and no operation is performed (i.e. the * list remains unaltered). * On success the 'list' pointer you pass to the function is returned. */list *listAddNodeHead(list *list, void *value){    listNode *node;    if ((node = zmalloc(sizeof(*node))) == NULL)        return NULL;    node->value = value;
    //长度为0的,增加一个那么头尾指针都指向这个节点
    //先让node的前驱指向null,node的后继指向头节点,然后让头节点的前驱指向node,最后在把头节点指向新的Node节点
    if (list->len == 0) {        list->head = list->tail = node;        node->prev = node->next = NULL;    } else {        node->prev = NULL;        node->next = list->head;        list->head->prev = node;        list->head = node;    }    list->len++;    return list;}
在头和尾部ADD道理一致


list *listInsertNode(list *list, listNode *old_node, void *value, int after) {    listNode *node;    if ((node = zmalloc(sizeof(*node))) == NULL)        return NULL;    node->value = value;
    //在old_node前还是后insert    if (after) {        node->prev = old_node;        node->next = old_node->next;        if (list->tail == old_node) {            list->tail = node;        }    } else {        node->next = old_node;        node->prev = old_node->prev;        if (list->head == old_node) {            list->head = node;        }    }    if (node->prev != NULL) {        node->prev->next = node;    }    if (node->next != NULL) {        node->next->prev = node;    }    list->len++;    return list;}




0 0
原创粉丝点击