redis源码分析(adlist)

    xiaoxiao2021-03-25  117

    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; }

    转载请注明原文地址: https://ju.6miu.com/read-12545.html

    最新回复(0)