1.动态字符串
sds结构:内有三个字段,len,free与buf[],前两者市记录存储字符串的长度与未使用的长度。后者则是用来储存字符串。
structsdshdr{
intlen; //字符串长度不包含最后的空字符\0(C的为n+1)
intfree;//空间的预留可以避免与C一样频繁分配内存
charbuf[];//最后以/0结尾
}
结构体中定义长度,可以避免需要获取长度时遍历整个字符串。同时可以根据len决定长度,避免特殊空字符串(\0)造成的错误识别。
虽然使用长度作为定义,但是还是会多分配一个字节保存空字符串。这是为了兼容C,从而兼容相关头文件。
2.链表
链表结构:内置三个字段*prev ,*next,*value.
typedefstruct listNode{
structlistNode *prev;
structlistNode *next;
void*value;
}listNode;
list链表:
typedefstruct list{
listNode*head;//头节点
listNode*tail;//尾节点
unsignedlong len;//链表长度
void*(*dup)(void *ptr);//节点复制函数
void(*free)(void *pre);//节点释放函数
int(*match)(void *pre,void *key);//节点对比函数
}list;
3.字典
在字典中,一个键key对应一个值value.且每一个键都是唯一的。
3.1字典实现-哈希表
Typedefstruct dictht{
dictEntry**table;//哈希数组
unsignedlong size;//哈希大小
unsignedlong sizemask;//哈希大小掩码 用于计算索引 值为size-1
unsignedlong used;//已有节点数
}dictht;
哈希数组节点表示:
Typedef struct dictEntry{
Void*key;
Union{
Void*val;
Unit64_tu64;
Int64_ts64;
}v;//解决不同类型的字段。
StructdictEntry *next;//指向哈希值相同的哈希表节点,将相同哈希值的节点串连起
//来,解决键冲突问题。
}dictEnry;