adlist
来源:互联网 发布:gallery3d源码分析 编辑:程序博客网 时间:2024/05/16 06:35
adlist.h adlist.c
adlist是redis中定义的双向链表。它定义了三种数据结构
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 long len;} list;
一个链表节点,一个迭代器,一个链表。主要定义了一些字段。
一些获取字段啊什么的小功能则用宏来定义了。
#define listLength(l) ((l)->len)#define listFirst(l) ((l)->head)#define listLast(l) ((l)->tail)#define listPrevNode(n) ((n)->prev)#define listNextNode(n) ((n)->next)#define listNodeValue(n) ((n)->value)#define listSetDupMethod(l,m) ((l)->dup = (m))#define listSetFreeMethod(l,m) ((l)->free = (m))#define listSetMatchMethod(l,m) ((l)->match = (m))#define listGetDupMethod(l) ((l)->dup)#define listGetFree(l) ((l)->free)#define listGetMatchMethod(l) ((l)->match)
通过宏定义可以在编译前直接写入,不必在运行时进行函数调用,提高了效率。
这部分看起来似乎并没有什么特别的地方。
中规中矩的生成函数
list *listCreate(void){ struct list *list; if ((list = zmalloc(sizeof(*list))) == NULL) return NULL; list->head = list->tail = NULL; list->len = 0; list->dup = NULL; list->free = NULL; list->match = NULL; return list;}
清空的时候逐个节点释放空间,然后释放整个链表。
void listEmpty(list *list){ unsigned long len; listNode *current, *next; current = list->head; len = list->len; while(len--) { next = current->next; if (list->free) list->free(current->value); zfree(current); current = next; } list->head = list->tail = NULL; list->len = 0;}void listRelease(list *list){ listEmpty(list); zfree(list);}
头插法和尾插法
list *listAddNodeHead(list *list, void *value)list *listAddNodeTail(list *list, void *value)
逆转链表,是用尾节点插入到表头实现的
void listRotate(list *list)
合并链表,通过将一个链表的头部接到另一个链表尾部实现
void listJoin(list *l, list *o)
其他还有一些函数,感觉没有介绍的必要了。
阅读全文
0 0
- adlist
- Redis adlist
- adlist.h
- (redis)adlist.h/adlist.c理解
- redis之adlist
- redis源码分析(adlist)
- Redis之2-双端链表(adlist.c,adlist.h)
- redis源码分析-adlist(链表)
- Redis源码学习(1):adlist
- Redis源码分析(adlist)
- Adlist 双向链表的实现 redis
- 【redis源码分析】双向链表---adlist
- Redis源码-数据结构之Adlist双端链表
- redis源码系列-数据结构(adlist/ziplist/dict)
- redis源码阅读(2)---- adlist分析
- redis学习笔记(2)---链表adlist
- Redis源码阅读笔记—adlist
- Redis-数据结构-链表-adlist.h/listNode
- 隐马尔科夫模型(二)
- centos安装golang、protobuf
- 1、IT学习班——流程图制作之安装与下载
- 随便记点,静态类,tostring()方法
- ios11新特性
- adlist
- 线程安全
- 第39级台阶
- fedora26安装flash插件、搜狗拼音、Mysql
- springmvc --解决url中的乱码问题
- 2.笔记 MySQL学习——创建用户及建立连接
- 数据库查询的实现:B树与磁盘I/O算法设计
- Android 超简单音乐播放器(八)通知栏切换显示更新歌曲 服务和活动之间的相互通信~
- 关于c#和java语言定义变量方式的意淫