您的位置:首页 > 数据库 > Redis

Redis_链表

2015-06-13 22:23 330 查看
先来看一下链表的数据结构

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是一个指针,所以……链表保存的值可以是各种不同类型的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis list 链表