Redis底层数据结构-双向链表
Redis的底层实现中,双向链表是一种常用的数据结构,它被广泛应用于组织数据集合,提供高性能的节点插入、删除和遍历操作。
在Redis中,双向链表被广泛用于实现复杂的数据结构,如列表键、发布/订阅机制、慢查询日志等。
以下是一个简单的双向链表实现的例子:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
// 创建一个新的链表节点
listNode *listNodeCreate(void *value) {
listNode *node = (listNode *)malloc(sizeof(listNode));
node->prev = NULL;
node->next = NULL;
node->value = value;
return node;
}
// 将节点插入到链表头部
void listAddNodeHead(listNode **list, listNode *node) {
if (*list == NULL) {
*list = node;
} else {
node->next = *list;
(*list)->prev = node;
*list = node;
}
}
// 移除链表的头节点
void listDelNode(listNode **list, listNode *node) {
if (node->prev == NULL) {
*list = node->next;
} else {
node->prev->next = node->next;
}
if (node->next) {
node->next->prev = node->prev;
}
}
// 打印链表
void listPrint(listNode *list) {
while (list != NULL) {
printf("%d\n", *(int *)(list->value));
list = list->next;
}
}
int main() {
listNode *list = NULL;
listNode *node1 = listNodeCreate((void *)1);
listNode *node2 = listNodeCreate((void *)2);
listNode *node3 = listNodeCreate((void *)3);
listAddNodeHead(&list, node1);
listAddNodeHead(&list, node2);
listAddNodeHead(&list, node3);
printf("List content:\n");
listPrint(list);
listDelNode(&list, node2);
printf("\nList after delete node2:\n");
listPrint(list);
return 0;
}
在这个例子中,我们定义了一个简单的双向链表节点结构体listNode
,并实现了创建新节点、将节点插入到链表头部以及移除节点的函数。最后,在main
函数中演示了如何使用这些函数来创建、修改和打印链表。
评论已关闭