Redis_链表
2015-06-13 22:23
330 查看
先来看一下链表的数据结构
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
然后是链表是如何创建的
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;
}链表添加一个头结点
list *listAddNodeHead(list *list, void *value)
{
listNode *node;
if ((node = zmalloc(sizeof(*node))) == NULL)
return NULL;
node->value = value;
if (list->len == 0) {
list->head = list->tail = node;
node->prev = node->next = NULL;
} else {
node->prev = NULL; //头结点的pre是NULL
node->next = list->head;
list->head->prev = node;
list->head = node;
}
list->len++;
return list;
}
链表添加一个尾结点
list *listAddNodeTail(list *list, void *value)
{
listNode *node;
if ((node = zmalloc(sizeof(*node))) == NULL)
return NULL;
node->value = value;
if (list->len == 0) {
list->head = list->tail = node;
node->prev = node->next = NULL;
} else {
node->prev = list->tail;
node->next = NULL; //尾结点的next是NULL
list->tail->next = node;
list->tail = node;
}
list->len++;
return list;
}
通过以上,可以分析出Redis链表的特性
1,可以直接获取链表的头结点和尾节点,并且可以直接获取某个节点的next结点和pre结点
2,头结点的pre是NULL,尾节点的next是NULL,所以链表是一个无环的,对一个链表遍历,无论是向前还是向后,最后都是NULL为终点
3,链表有len计数器,所以获取链表的长度的复杂度是1
3,链表的value是一个指针,所以……链表保存的值可以是各种不同类型的。
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
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;
然后是链表是如何创建的
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;
}链表添加一个头结点
list *listAddNodeHead(list *list, void *value)
{
listNode *node;
if ((node = zmalloc(sizeof(*node))) == NULL)
return NULL;
node->value = value;
if (list->len == 0) {
list->head = list->tail = node;
node->prev = node->next = NULL;
} else {
node->prev = NULL; //头结点的pre是NULL
node->next = list->head;
list->head->prev = node;
list->head = node;
}
list->len++;
return list;
}
链表添加一个尾结点
list *listAddNodeTail(list *list, void *value)
{
listNode *node;
if ((node = zmalloc(sizeof(*node))) == NULL)
return NULL;
node->value = value;
if (list->len == 0) {
list->head = list->tail = node;
node->prev = node->next = NULL;
} else {
node->prev = list->tail;
node->next = NULL; //尾结点的next是NULL
list->tail->next = node;
list->tail = node;
}
list->len++;
return list;
}
通过以上,可以分析出Redis链表的特性
1,可以直接获取链表的头结点和尾节点,并且可以直接获取某个节点的next结点和pre结点
2,头结点的pre是NULL,尾节点的next是NULL,所以链表是一个无环的,对一个链表遍历,无论是向前还是向后,最后都是NULL为终点
3,链表有len计数器,所以获取链表的长度的复杂度是1
3,链表的value是一个指针,所以……链表保存的值可以是各种不同类型的。
相关文章推荐
- [C/C++]反转链表
- redis安装问题小结
- Redis偶发连接失败案例实战记录
- Redis和Memcached的区别详解
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- redis中修改配置文件中的端口号 密码方法
- Redis和Memcache的区别总结
- C#中Ilist与list的区别小结
- C#中IList<T>与List<T>的区别深入解析
- C#对list列表进行随机排序的方法
- Redis服务器的启动过程分析
- web 应用中常用的各种 cache详解
- C++实现的泛型List类分享
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 利用yum安装Redis的方法详解
- 为啥懒 Redis 是更好的 Redis
- C# Datagridview绑定List方法代码
- javascript radio list的实现细节(多浏览器兼容)
- c++ STL容器总结之:vertor与list的应用