持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
[toc]
简介
edict english dictionary 英文字典,一个字符串key对应一个value
第一版的英文字典数据结构,可以实现增加,查找,其他功能暂未实现,使用二叉树存储节点,但是二叉树用的略微有点不好,因为节点如果只向一个方向增加的话,这棵树会长歪//
头文件接口设计
结构体
typedef struct s_ksedict_node
{
struct s_ksedict_node* left;
struct s_ksedict_node* right;
uint32_t hash;
char* key;
char* payload;
}s_ksedict_node;
typedef struct
{
bool used;
}s_ksedict_node_status;
typedef struct
{
/** by user */
unsigned int maxsize; //
/** auto */
int cnt;
s_ksedict_node* nodemem;
s_ksedict_node* head;
s_ksedict_node_status* node_status;
}s_ksedict;
- node 节点,带有左节点、右节点的指针,带有hash值,带有字典的单词和释义
- s_ksedict_node_status 状态,用于不经常使用malloc,将一次申请得到的空间分片,标识每片的状态
- s_ksedict 一整个字典的句柄,包含这个字典的最大容量、节点信息,已存储的数量,没片内存空间的状态
接口设计
int ksedict_init(s_ksedict* edict, int maxsize);
/**
* @brief
*
* @param edict
* @param mem edict mem alloc by user, mem size = maxsize * (sizeof(s_ksedict_node) + sizeof(s_ksedict_node_status))
* @param maxsize
* @return int
*/
int ksedict_static_init(s_ksedict* edict, void* mem, int maxsize);
int ksedict_push(s_ksedict* edict, char* key, char* payload);
int ksedict_pop(s_ksedict* edict, char* key, char** payload);
int ksedict_exit(s_ksedict* edict);
- ksedict_init 初始化句柄,使用动态内存一次性分配字典的空间大小
- ksedict_static_init 使用由用户分配的静态内存
- ksedict_push 向字典中添加字段
- ksedict_pop 从字典中取出内容
- ksedict_exit 释放这个字典
设计
一共只有初始化、压入、弹出、退出,四个操作,只有最简单的接口,调用的时候,先申明一个s_ksedict
结构体,再看需求使用静态内存还是由ksedict自己分配内存。使用的时候直接向这个字典压入需要的字符串作为字典的查找单词即可,负载就是这个英文单次的释义。
内部使用二叉树来实现,压入的时候查找合适的节点插入新的节点,弹出的时候顺着二叉树查找,二叉树的跟存储在 s_ksedict_node* head;
这里,保存在整个字典的句柄中,目前的实现,二叉树的根不会移动,还有问题,因为根不移动,二叉树可能只向一边添加字段,会导致长歪。。。。