Redis中的链表

2019-05-06  本文已影响0人  jiangling500

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

// 结点
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
}
上一篇下一篇

猜你喜欢

热点阅读