adlist採用雙向鍊錶的形式
list 列表定義
// 定義list列表
typedef struct list list;
list 迭代器
// list 迭代器,單向
typedef struct listiter listiter;
listnode節點
// 定義listnode節點
typedef
struct listnode listnode;
adlist 常用的方法
// 巨集定義的一些操作
#define listlength(l) ((l)->len) // list長度
#define listfirst(l) ((l)->head) // 獲取list 頭部
#define listlast(l) ((l)->tail) // 獲取list 尾部
#define listprevnode(n) ((n)->prev) // 獲取某節點的上乙個節點
#define listnextnode(n) ((n)->next) // 獲取某節點下乙個節點
#define listnodevalue(n) ((n)->value) // 獲取某節點的值,對應的是個函式指標
// 分別設定和獲取dup、free、match
#define listsetdupmethod(l,m) ((l)->dup = (m)) // list的複製函式的設定
#define listsetfreemethod(l,m) ((l)->free = (m)) // list的釋放函式的設定
#define listsetmatchmethod(l,m) ((l)->match = (m)) // list的匹配函式的設定
#define listgetdupmethod(l) ((l)->dup) // list的複製函式的獲取
#define listgetfree(l) ((l)->free) // list的釋放函式的獲取
#define listgetmatchmethod(l) ((l)->match) // list的釋放函式的獲取
/* prototypes */
// 方法原型
list *listcreate(void); //建立乙個list列表
void listrelease(list *list); // 釋放乙個list
void listempty(list *list); // 將list置空
list *listaddnodehead(list *list, void *value); // 在list頭部新增節點
list *listaddnodetail(list *list, void *value); // 在list尾部新增節點
// 在list某個節點後面插入節點
list *listinsertnode(list *list, listnode *old_node, void *value, int after);
void listdelnode(list *list, listnode *node); // 刪除指定節點
listiter *listgetiterator(list *list, int direction); // 獲取list的迭代器
listnode *listnext(listiter *iter); // 利用list迭代器獲取的下乙個節點
void listreleaseiterator(listiter *iter); // 釋放list迭代器
list *listdup(list *orig); // 列表的複製
listnode *listsearchkey(list *list, void *key); // 在list列表中查詢某個值對應的節點
listnode *listindex(list *list, long index); // 獲取list列表中某個位置的節點
void listrewind(list *list, listiter *li); // 重置迭代器方向從頭部開始
void listrewindtail(list *list, listiter *li); // 重置迭代器方向從尾部開始
void listrotate(list *list); // list 翻轉
void listjoin(list *l, list *o); // 將o 列表對應的節點插入到l 列表中
/* directions for iterators */
// 巨集定義 迭代器的方向 0:從頭部向尾部,1:從尾部向頭部
#define al_start_head 0
#define al_start_tail 1
#endif /* __adlist_h__ */
redis原始碼閱讀筆記
在redis中乙個資料庫結構體是這樣的 每個dict是乙個hash表 typedef struct redisdb redisdb dict欄位中存放以key值為鍵,以value指標為值的hash表項dict根據型別的不同分為如下幾種 1 字串 string 操作 set key value get...
redis原始碼學習筆記
目錄 1 從資料結構開始 圖為原始碼,附帶個人簡單分析 a 動態字串 檔案 sds.h sds.c 前言 s sizeof struct sdshdr 的解釋為buf為柔性陣列,不占用空間,僅僅為偏移量,所以s指標向後退乙個結構體大小為結構體位址所在。分析 這個結構是整個動態字串的基礎,sds為 s...
redis原始碼筆記 ae epoll c
這部分 是具體事件觸發網路庫的底層實現。linux下有epoll設施,而且其效率是現在最高的。注意即使高效如redis,其也只是選擇了自動檔 水平觸發 自動檔和手動檔的典故請自行google 據說libevent也是使用的水平觸發。廢話不多說,看 吧。1 include 2 3 typedef st...