第3章 链表

1. 链表和链表节点的实现

每个链表节点使用一个adlist.h/listNode结构来表示

/*
 * 链表节点
 */
typedef struct listNode {

    // 前驱节点
    struct listNode *prev;

    // 后继节点
    struct listNode *next;

    // 值
    void *value;

} listNode;

使用adlist.h/list来持有链表

/*
 * 链表
 */
typedef struct list {

    // 表头指针
    listNode *head;

    // 表尾指针
    listNode *tail;

    // 节点数量
    unsigned long len;

    // 复制函数
    void *(*dup)(void *ptr);
    // 释放函数
    void (*free)(void *ptr);
    // 比对函数
    int (*match)(void *ptr, void *key);
} list;

Redis链表特性:
  • 双端
  • 无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点
  • 带表头指针和表尾指针
  • 带链表长度计数器
  • 多态:链表节点使用void *指针来保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值

2. 链表和链表节点的API

listSetDupMethod

listGetDupMethod

listSetFreeMethod

listGetFreeMethod

listSetMatchMethod

listGetMatchMethod

listLength

listFirst

listLast

listPreNode

listNextNode

listNodeValue

listCreate

listAddNodeHead

listAddNodeTail

listInsertNode

listSearchKey

listIndex

listDelNode

listRotate 将链表的表尾节点弹出,然后将被弹出的节点插入到链表的表头,成为新的表头节点

listDup 复制一个给定链表的副本

listRelease 释放给定链表,以及链表中的所有节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值