第一次自学一种新的数据结构,感觉学会利用资源很重要,参考别人写的博客,谷歌搜索一下关于这中数据结构的一些问题,解决等,学会搜索资料,学习并掌握一门数据结构并不是很难。
要知道相关的基本知识,主要应用与哪一方面,还有它的具体实现是如何的。
在编码的时候还是会遇到各种问题,需要认真解决。总体来说学习得还是比较成功得,也掌握了它的使用。
一、分析题目要求
(一)程序设计的任务:
学习一种课外的数据结构,并实现它。包括:1)初始化2)插入元素3)删除元素4)查找元素5)相关应用
本程序实现了以上5个要求,实验报告是根据Trie树的学习与实现过程而写的。
(二)函数规定
·Trie CreateTrieNode()
1) 创建Tire树
参数 :无
返回值 :Trie 已初始化的TrieNode节点指针
2) 输入的形式 :无
输入值的范围:无
3) 输出的形式 :无
4) 所能达到的功能:
用于创建Trie节点,初始化count为0,exist为false,子节点为NULL
·void InsertTrieNode(Trie root , char *word)
1) 插入单词元素
参数 :Trie 指定节点
:word 指定单词字符串
返回值 :无
2) 输入的形式 :字符串类型
输入值的范围:字符串范围
3) 输出的形式 :无
4) 所能达到的功能:
用于向指定节点插入指定字符串节点
·bool SearchString(Trie root , char* word)
1) 查找字符串
参数 :Trie 指定节点
:word 指定单词字符串
返回值 :bool 是否存在指定字符串
2) 输入的形式 :字符串类型
输入值的范围:字符串范围
3) 输出的形式 :无
4) 所能达到的功能:
用于在指定根节点中查找字符串是否存在
·int SearchTrieNode(Trie root , char* word)
1) 查找单词前缀出现的次数
参数 :Trie 指定节点
:word 指定单词字符串
返回值 :int 单词前缀出现的次数
2) 输入的形式 :字符串类型
输入值的范围:字符串范围
3) 输出的形式 :无
4) 所能达到的功能:
用于在指定根节点中查找单词前缀次数,类似SearchString
·bool DelectString(Trie root , char* word)
1) 删除指定单词
参数 :Trie 指定节点
:word 指定单词字符串
返回值 :bool 删除成功与否
2) 输入的形式 :字符串类型
输入值的范围:字符串范围
3) 输出的形式 :无
4) 所能达到的功能:
用于在指定根节点中删除指定单词
·void DelectTrie(Trie root)
1) 删除整棵树
参数 :Trie 指定字典树
返回值 :无
2) 输入的形式 :Trie结构指针
输入值的范围:无
3) 输出的形式 :无
4) 所能达到的功能:
因为现实中删除某个元素的情况较少见,而删除整棵树较为常见,
因此提供删除整棵树的方法,用于释放整个字典树占的堆空间
·void TraverTrie(Trie root)
1) 遍历整个字典树
参数 :Trie 指定字典树
返回值 :无
2) 输入的形式 :Trie结构指针
输入值的范围:无
3) 输出的形式 :字符串类型
4) 所能达到的功能:
输出字典树中的每一个单词
·void introdution()
1) 遍历整个字典树
参数 :无
返回值 :无
2) 输入的形式 :无
输入值的范围:无
3) 输出的形式 :字符串类型
4) 所能达到的功能:
这是一个输出顶部介绍的函数,因为不想在这里打太多代码,
所以使用了宏定义,具体代码包含在head.h的头文件中。
·void memu()
1) 输出菜单的函数
参数 :无
返回值 :无
2) 输入的形式 :无
输入值的范围:无
3) 输出的形式 :字符串类型
4) 所能达到的功能:
使用了宏定义,包含在head.h中
·void working()
1) 主要工作的函数
参数 :无
返回值 :无
2) 输入的形式 :int整型,char字符类型,string字符串类型
输入值的范围:int 2147483647~-2147483648,char -128~127
3) 输出的形式 :字符串类型
4) 所能达到的功能:
主函数的运行主要在此,但在主函数里面调用此函数即可,
用于完成增删查改
·int main()
1) 主函数
参数 :无
返回值 :int 型
2) 输入的形式 :无
输入值的范围:无
3) 输出的形式 :字符串类型
4) 所能达到的功能:
程序的入口,分别调用其他函数以实现其功能
二、解题思路
Trie树的数据结构:
typedef struct TrieNode
{
int count; //用来统计单词前缀出现的次数
struct TrieNode* next[26]; //指向各个子树的指针
bool exist; //标记该节点处是否构成单词
char trans[11]; //当前节点对应的单词
}TrieNode ,*Trie;
1)初始化:
在内存申请一块Trie树的指针空间,把初始值设为0;
2)插入元素:
对于一个单词,从根开始,沿着单词的各个字母所对应的树中的节点分支向下走, 直到单词遍历完,将最后的节点的exist标记为true,表示该单词已插入Trie树。
while(字符串未结束)
{
if(当前位置为空)
{
位当前元素申请空间;
}
指针指向当前元素;
为当前元素赋值
字符串向下移
}
3)删除元素:
对于一个单词,判断是否存在字典树中,不存在即返回;
存在分是否为字符串的前缀,以递归的形式进行删除。
1不是