2.链表

一、链表和链表节点的实现

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

typrdef struct listNode{
     //前置节点
     strcut listNode *prev;
    
      //后置节点
      struct listNode *next;
      
      //值
      void *value;
}listNode;

多个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;
list结构和listNode结构构成的链表

Redis链表实现的特性:

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



    链表和链表节点API
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 链表作为算法基础,相信大家都不会陌生。链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点...
    喵帕斯0_0阅读 265评论 0 0
  •   终于开始提笔写算法(2)了,我先为自己鼓个小手,然后决定,这一波写个常见的数据结构,链表,还望各位小伙伴多多支...
    大王叫我来巡老和山阅读 1,196评论 2 5
  • redis使用两种数据结构保存链表,分别是ziplist与linkedlist,内存占用及常用操作效率各不相同。本...
    但莫阅读 1,209评论 0 1
  • 套路 很大概率需要至少两根指针来完成纯链表问题的解决 经常加入额外的头结点来使链表中包括原表头的所有节点处理方式相...
    coderjiege阅读 458评论 0 0
  • 1.可变数组的缺陷 每次成长需要分配新的内存,需要时间拷贝元素,申请内存是连续的,有可能会出现内存充足却分配不到内...
    hyt222阅读 365评论 0 0