1.動(dòng)態(tài)字符串
sds結(jié)構(gòu):內(nèi)有三個(gè)字段贯要,len,free與buf[],前兩者市記錄存儲(chǔ)字符串的長(zhǎng)度與未使用的長(zhǎng)度俊马。后者則是用來(lái)儲(chǔ)存字符串稿黍。
structsdshdr{
intlen; //字符串長(zhǎng)度不包含最后的空字符\0(C的為n+1)
intfree;//空間的預(yù)留可以避免與C一樣頻繁分配內(nèi)存
charbuf[];//最后以/0結(jié)尾
}
結(jié)構(gòu)體中定義長(zhǎng)度,可以避免需要獲取長(zhǎng)度時(shí)遍歷整個(gè)字符串饰序。同時(shí)可以根據(jù)len決定長(zhǎng)度啸臀,避免特殊空字符串(\0)造成的錯(cuò)誤識(shí)別。
雖然使用長(zhǎng)度作為定義赐写,但是還是會(huì)多分配一個(gè)字節(jié)保存空字符串鸟蜡。這是為了兼容C,從而兼容相關(guān)頭文件挺邀。
2.鏈表
鏈表結(jié)構(gòu):內(nèi)置三個(gè)字段*prev ,*next,*value.
typedefstruct listNode{
structlistNode *prev;
structlistNode *next;
void*value;
}listNode;
list鏈表:
typedefstruct list{
listNode*head;//頭節(jié)點(diǎn)
listNode*tail;//尾節(jié)點(diǎn)
unsignedlong len;//鏈表長(zhǎng)度
void*(*dup)(void *ptr);//節(jié)點(diǎn)復(fù)制函數(shù)
void(*free)(void *pre);//節(jié)點(diǎn)釋放函數(shù)
int(*match)(void *pre,void *key);//節(jié)點(diǎn)對(duì)比函數(shù)
}list;
3.字典
在字典中揉忘,一個(gè)鍵key對(duì)應(yīng)一個(gè)值value.且每一個(gè)鍵都是唯一的。
3.1字典實(shí)現(xiàn)-哈希表
Typedefstruct dictht{
dictEntry**table;//哈希數(shù)組
unsignedlong size;//哈希大小
unsignedlong sizemask;//哈希大小掩碼 用于計(jì)算索引 值為size-1
unsignedlong used;//已有節(jié)點(diǎn)數(shù)
}dictht;
哈希數(shù)組節(jié)點(diǎn)表示:
Typedef struct dictEntry{
Void*key;
Union{
Void*val;
Unit64_tu64;
Int64_ts64;
}v;//解決不同類型的字段端铛。
StructdictEntry *next;//指向哈希值相同的哈希表節(jié)點(diǎn)泣矛,將相同哈希值的節(jié)點(diǎn)串連起
//來(lái),解決鍵沖突問(wèn)題禾蚕。
}dictEnry;