美文网首页
Redis中的链表

Redis中的链表

作者: jiangling500 | 来源:发表于2019-05-06 00:21 被阅读0次

    链表/结点/迭代器结构体

    // 结点
    typedef struct listNode
    {
        struct listNode *prev;
        struct listNode *next;
        void *value;
    } 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 int len; // 链表所包含的结点数量
    } list;
    

    链表迭代器

    // 返回链表迭代器,既可以从链表头开始迭代,也可以从链表尾开始迭代
    listIter *listGetIterator(list *list, int direction)
    {
        listIter *iter;
        
        if ((iter = zmalloc(sizeof(*iter))) == NULL)
        {
            return NULL;
        }
        
        // 从链表头开始
        if (direction == AL_START_HEAD)
        {
            iter->next = list->head;
        }  
        // 从链表尾开始
        else
        {
            iter->next = list->tail;
        }
            
        iter->direction = direction;
        
        return iter;
    }
    
    // 释放链表迭代器
    void listReleaseIterator(listIter *iter)
    {
        zfree(iter);
    }
    

    通过迭代器获取链表中下一个结点

    // 从链表迭代器中返回下一个结点
    listNode *listNext(listIter *iter)
    {
        listNode *current = iter->next;
    
        if (current != NULL)
        {
            if (iter->direction == AL_START_HEAD)
            {
                iter->next = current->next;
            }  
            else
            {
                iter->next = current->prev;
            }
                
        }
        return current;
    }
    

    迭代整个链表

    listIter *iter;
    listNode *node;
    
    iter = listGetIterator(orig, AL_START_HEAD);
    while((node = listNext(iter)) != NULL)
    {
      // TODO
    }
    

    相关文章

      网友评论

          本文标题:Redis中的链表

          本文链接:https://www.haomeiwen.com/subject/llhloqtx.html