最近在研究redis原始碼,順便複習一下資料結構,感覺好多都忘了,下面**是redis-3.0.4裡面adlist.c和adlist.h的部分原始碼,部分給摘除出來了,方便以後使用,如果錯誤或者其他可以優化的地方希望大家提出來
#ifndef __list_h__
#define __list_h__
typedef struct listnode
listnode;
typedef struct list
list;
#define listlength(l) ((l)->len)
list *listcreate(void);
list *listaddnodehead(list *list, void *value);
void listrelease(list *list);
listnode *listsearchkey(list *list, void *key);
void listdelnode(list *list, listnode *node);
#endif
原始檔
#include "list.h"
#include #include #include void print(void *value)
void printall(list *list) }}
int match(void *ptr, void *key)
list *listcreate(void)
list *listaddnodehead(list *list, void *value)
node->value = value;
node->next = null;
if (!listlength(list))
else
list->len++;
return list;
}void listrelease(list *list)
free(current);
current = next;
} free(list);
}listnode *listsearchkey(list *list, void *key)
listnode *current = list->head;
int len = listlength(list);
while(len--)
}else
}current = current->next;
} return null;
}void listdelnode(list *list, listnode *node)
if(list->free)
listnode *current = list->head->next;
if(node == list->head)
current = list->head->next;
listnode *pre = list->head;
while(current)
pre = current;
current = current->next; }}
int main()
int val = 1;
listnode *node = listsearchkey(list,&val);
listdelnode(list,node);
list->printall(list);
listrelease(list);
return 0;
}
陸續會繼續更新,主要移植redis-3.0.4演算法部分,希望大家提出寶貴的意見 Redis 鍊錶
定義 每個鍊錶節點使用乙個 adlist.h listnode 結構來表示 typedef struct listnode listnode adlist.h list 列表結構 typedef struct list list 特性 redis 的鍊錶實現的特性可以總結如下 雙端 鍊錶節點帶有 p...
Redis 鍊錶和鍊錶節點
每個鍊錶節點使用乙個 adlist.h listnode 結構來表示 typedef struct listnode listnode 多個 listnode 可以通過 prev 和 next 指標組成雙向鍊錶。使用 adlist.h list 來持有鍊錶,操作起來會更方便 typedef stru...
Redis之鍊錶
鍊錶在redis中的應用非常廣泛,列表鍵的底層實現之一就是鍊錶,發布與訂閱 慢查詢 監視器等功能也用到了鍊錶,redis伺服器本身使用鍊錶來儲存多個客戶端的狀態資訊,以及使用鍊錶來構建客戶端輸出緩衝區。鍊錶的實現原始碼 鍊錶節點 typedef struct listnode listnode 鍊錶...