循环链表前后移动位置函数

本文介绍了在Redis源码中用于在循环链表中前后移动指针的函数,包括`listGetIterator`、`listReleaseIterator`和`listNext`。这些函数方便地封装了迭代过程,确保正确操作链表节点。示例代码展示了如何使用这些函数进行迭代操作。

在使用链表是常用的指针向前后移动的情况,如果使用不当很容易写错,以下是看到的一种函数封装操作来实现的方式。

以下是在redis源码中看到的迭代函数:


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;
iter = listGetIterator(list,<direction>);
while ((node = listNext(iter)) != NULL) {
doSomethingWith(listNodeValue(node));
}
listReleaseIterator(iter);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值