分析**之前先看看鍊錶的資料結構。
// 新建乙個煉表頭結點
list *
listcreate
(void
)
// 釋放乙個鍊錶
void
listrelease
(list *list)
// 釋放鍊錶記憶體
zfree
(list)
;}
3 插入乙個節點(支援頭插和尾插)
// 給鍊錶新增乙個節點,頭插法
list *
listaddnodehead
(list *list,
void
*value)
else
// 節點數加一
list-
>len++
;return list;
}// 給鍊錶新增乙個節點,尾插法
list *
listaddnodetail
(list *list,
void
*value)
else
list-
>len++
;return list;
}
// 刪除節點node
void
listdelnode
(list *list, listnode *node)
查詢有兩種,第一是根據索引查詢,第二種是根據鍵查詢。
// 返回鍊錶的第index個位元組
listnode *
listindex
(list *list,
int index)
else
return n;
}
通過鍵查詢
// 遍歷鍊錶,查詢key對應的節點
listnode *
listsearchkey
(list *list,
void
*key)
}else}}
listreleaseiterator
(iter)
;return
null
;}
// 複製乙個鍊錶
list *
listdup
(list *orig)
}else
// 預設淺複製
value = node-
>value;
// 插入新的鍊錶if(
listaddnodetail
(copy, value)
==null)}
// 用完了,釋放迭代器
listreleaseiterator
(iter)
;return copy;
}
7 迭代鍊錶
首先申請乙個迭代器。
// 申請乙個鍊錶迭代器
listiter *
listgetiterator
(list *list,
int direction)
然後利用這個迭代器就可以進行迭代鍊錶了
// 一次迭代,返回鍊錶中的乙個節點
listnode *
listnext
(listiter *iter)
return current;
}
redis0 1原始碼解析之字典
字典也叫雜湊表。看一下redis中的實現。下面是資料結構關係圖。redis中,雜湊表的設計思想是,申請乙個指標陣列,然後每個元素指向乙個鍊錶用來儲存資料 即鏈位址法 申請乙個表示字典的資料結構 dict dictcreate dicttype type,void privdataptr 初始化字典資...
redis0 1原始碼解析之事件驅動
redis的事件驅動模組負責處理檔案和定時器兩種任務。下面是幾個函式指標 typedef void aefileproc struct aeeventloop eventloop,int fd,void clientdata,int mask typedef intaetimeproc struct...
redis原始碼解析之鍊錶結構
typedef struct listnode listnode 雙端鍊錶節點包含2個指標域和1個資料域,注意資料的型別為void 因此其可以承載任意資料型別。typedef struct list list 雙端鍊錶中,使用函式指標來封裝與節點值相關的操作,在後面的使用中較頻繁,並維護乙個len作...