电子小字典(南航2022数据结构课程设计第十八题)

news/2024/11/25 19:22:49/

[问题描述]

利用键树结构,建立一个微型电子字典。

[基本要求]

实现生词的加入,单词的查找、删除,修改等操作。

[基本思路]

这道题的关键就是键树的操作,键树大概就是下图的样子,每个节点存一个字母,多个节点相连构成一个单词,单词的最后一个字母的节点再存储汉译,并用一个bool记这是个单词的结尾。

 [代码实现]

头文件即节点声明

#include<iostream>
#include<fstream>
using namespace std;
typedef struct node
{bool is_word;//记录是否是单词的尾字母char data;//当前节点数据string translation;//汉译node* next[26];//子节点指针,a~z的顺序int num;//子结点个数node()//构造函数{memset(next, NULL, sizeof(next));num = 0;is_word = false;}
}node;
node* root = new node;//根节点声明

单词添加

void add(string tran, string s, node* t, int d)
{if (t->next[int(s[d] - 'a')] == NULL)//该节点子节点字符没有与所添加单词下一字母相同的{t->next[int(s[d] - 'a')] = new node;//新建节点t->next[int(s[d] - 'a')]->data = s[d];if (d == s.length() - 1)//单词存储完成{t->next[int(s[d] - 'a')]->is_word = true;t->next[int(s[d] - 'a')]->translation = tran;cout << tran << endl;t->num++;return;}t->num++;add(tran, s, t->next[int(s[d] - 'a')], d + 1);}else//有相同的{if (d == s.length() - 1)//单词存储完成{t->next[int(s[d] - 'a')]->is_word = true;t->next[int(s[d] - 'a')]->translation = tran;cout << tran << endl;return;}add(tran, s, t->next[int(s[d] - 'a')], d + 1);}
}

单词删除

bool delete_(string s, node* t, int d) 
{if (d == s.length()){t->is_word = false;if (t->num == 0)//该节点无子节点{return true;}return false;}else{if (delete_(s, t->next[int(s[d] - 'a')], d + 1))//若末节点删除,则删除其在上一节点对应的信息{free(t->next[int(s[d] - 'a')]);t->next[int(s[d] - 'a')] = NULL;if (t->is_word)//若当前节点return false;t->num--;if (t->num == 0)//若当前节点仍有其他子节点,保留return true;elsereturn false;}else//否则上节点无变化{return false;}}
}

单词查找

bool search(string s,node *t,int d,bool flag)
{static char out[100] = { '\0' };if (d == s.length()){if (t->is_word == true){if (flag){for (int i = 0; i <= d; i++)cout << out[i];cout << ' ' << t->translation;cout << endl;}return true;}elsereturn false;}if (t->next[int(s[d] - 'a')] == NULL){return false;}else{return search(s, t->next[int(s[d] - 'a')], d + 1, flag);}
}

单词展示

void show(node *t,int d)
{static char s[32] = { 0 };if (d != -1)s[d] = t->data;if (t->is_word){for (int i = 0; i <= d; i++)cout << s[i];cout << ' ' << t->translation << endl;}for (int i = 0; i < 26; i++){if (t->next[i] != NULL)show(t->next[i], d + 1);}return;
}

单词存储(单词添加可以直接在文件尾追加,没必要用这个函数,主要是删除)

void sort(node* t, int d)
{fstream file("word.txt", ios::app);static char s[100] = { '\0' };if (d != -1)s[d] = t->data;else{fill(s, s + 100, '\0');}if (t->is_word){for (int i = 0; i <= d; i++)file << s[i];file << ' ';file << t->translation;file << '\n';file.flush();}for (int i = 0; i < 26; i++){if (t->next[i] != NULL)sort(t->next[i], d + 1);}file.flush();
}

源代码

#include<iostream>
#include<fstream>
using namespace std;
typedef struct node
{bool is_word;//记录是否是单词的尾字母char data;//当前节点数据string translation;//汉译node* next[26];//子节点指针int num;//子结点个数node()//构造函数{memset(next, NULL, sizeof(next));num = 0;is_word = false;}
}node;
node* root = new node;//根节点声明
bool is_lawful(string s)
{int i = 0;while (s[i] != '\0'){if (s[i] > 'z' || s[i] < 'a')return false;i++;}return true;
}
void add(string tran, string s, node* t, int d)
{if (t->next[int(s[d] - 'a')] == NULL)//该节点子节点字符没有与所添加单词下一字母相同的{t->next[int(s[d] - 'a')] = new node;//新建节点t->next[int(s[d] - 'a')]->data = s[d];if (d == s.length() - 1)//单词存储完成{t->next[int(s[d] - 'a')]->is_word = true;t->next[int(s[d] - 'a')]->translation = tran;//cout << tran << endl;t->num++;return;}t->num++;add(tran, s, t->next[int(s[d] - 'a')], d + 1);}else//有相同的{if (d == s.length() - 1)//单词存储完成{t->next[int(s[d] - 'a')]->is_word = true;t->next[int(s[d] - 'a')]->translation = tran;//cout << tran << endl;return;}add(tran, s, t->next[int(s[d] - 'a')], d + 1);}
}
bool delete_(string s, node* t, int d) 
{if (d == s.length()){t->is_word = false;if (t->num == 0)//该节点无子节点{return true;}return false;}else{if (delete_(s, t->next[int(s[d] - 'a')], d + 1))//若末节点删除,则删除其在上一节点对应的信息{free(t->next[int(s[d] - 'a')]);t->next[int(s[d] - 'a')] = NULL;if (t->is_word)return false;t->num--;if (t->num == 0)return true;elsereturn false;}else//否则上节点无变化{return false;}}
}
void initialize()
{fstream file("word.txt", ios::in);if (file.fail()){cout << "word.txt打开失败!!!" << endl;exit(0);}while (!file.eof()){string s;string tran;file >> s;file >> tran;//cout << s << endl;if (s != "")add(tran, s, root, 0);}
}
bool search(string s,node *t,int d,bool flag)
{static char out[100] = { '\0' };if (d == s.length()){if (t->is_word == true){if (flag){for (int i = 0; i <= d; i++)cout << out[i];cout << ' ' << t->translation;cout << endl;}return true;}elsereturn false;}if (t->next[int(s[d] - 'a')] == NULL){return false;}else{return search(s, t->next[int(s[d] - 'a')], d + 1, flag);}
}
void show(node *t,int d)
{static char s[32] = { 0 };if (d != -1)s[d] = t->data;if (t->is_word){for (int i = 0; i <= d; i++)cout << s[i];cout << ' ' << t->translation << endl;}for (int i = 0; i < 26; i++){if (t->next[i] != NULL)show(t->next[i], d + 1);}return;
}
void sort(node* t, int d)
{fstream file("word.txt", ios::app);static char s[100] = { '\0' };if (d != -1)s[d] = t->data;else{fill(s, s + 100, '\0');}if (t->is_word){for (int i = 0; i <= d; i++)file << s[i];file << ' ';file << t->translation;file << '\n';file.flush();}for (int i = 0; i < 26; i++){if (t->next[i] != NULL)sort(t->next[i], d + 1);}file.flush();
}
void run()
{while (1){cout << "1.添加单词" << endl << "2.查找单词" << endl << "3.删除单词" << endl << "4.修改单词" << endl;cout << "5.单词展示" << endl << "6.退出程序" << endl;int choice;cin >> choice;switch (choice){case 1: {string s;string tran;cout << "请输入单词:";cin >> s;cout << "请输入汉译:";cin >> tran;if (!is_lawful(s)){cout << "输入不合法!!!" << endl;system("pause");system("cls");break;}if (search(s, root, 0, false)){cout << "单词已存在!!!" << endl;system("pause");system("cls");break;}fstream file("word.txt", ios::app);if (file.fail()){cout << "word.txt打开失败!!!" << endl;exit(0);}file << s << ' ' << tran << '\n';file.close();add(tran, s, root, 0);cout << "添加成功!!!" << endl;system("pause");system("cls");break;}case 2: {cout << "请输入要查找的单词:";string s;cin >> s;if (!is_lawful(s)){cout << "输入不合法!!!" << endl;system("pause");system("cls");break;}if (search(s, root, 0, true)){cout << "单词存在。" << endl;}else{cout << "未找到!!!" << endl;}system("pause");system("cls");break;}case 3: {string s;cout << "请输入要删除的单词:";cin >> s;if (!is_lawful(s)){cout << "输入不合法!!!" << endl;system("pause");system("cls");break;}if (!search(s, root, 0, false)){cout << "单词不存在!!!" << endl;system("pause");system("cls");break;}delete_(s,root,0);fstream file("word.txt", ios::trunc | ios::out);sort(root, -1);file.close();cout << "删除成功!!!" << endl;system("pause");system("cls");break;}case 4: {string s1, s2;while (1){cout << "请输入要修改的单词:";cin >> s1;if (!is_lawful(s1)){cout << "输入不合法!!!" << endl;system("pause");system("cls");continue;}if (!search(s1, root, 0, false)){cout << "单词不存在!!!" << endl;system("pause");system("cls");continue;}break;}string tran;while (1){cout << "请输入写改成什么单词:";cin >> s2;cout << "汉译:";cin >> tran;if (!is_lawful(s2)){cout << "输入不合法!!!" << endl;system("pause");system("cls");continue;}break;}delete_(s1, root, 0);add(tran, s2, root, 0);fstream file("word.txt", ios::trunc | ios::out);sort(root, -1);file.close();cout << "修改成功!!!" << endl;system("pause");system("cls");break;}case 5: {show(root, -1);system("pause");system("cls");break;}case 6: {return;}}}
}
int main()
{initialize();run();return 0;
}

[运行结果]


http://www.ppmy.cn/news/276687.html

相关文章

字库在嵌入式系统使用

随着现代电子与信息技术的不断发展&#xff0c;信息处理产品的种类越来越多。常 见的涉及信息处理的软件产品和嵌入式系统包括&#xff1a;桌面操作系统&#xff08;Windows、Mac、Linux、Unix等&#xff09;、具有文字处理功能的软件&#xff08;Office、CAD、OA等&#xff09…

屏幕取词的原理

“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的&#xff0c;如四通利方和金山词霸等软件&#xff0c;这个技术看似简单&#xff0c;其实在windows系统中实现却是非常复杂的&#xff0c;总的来说有两种实现方式&#xff1a; 第一种&#xff1a;采用截获对部分gdi的api调用…

嵌入式的应用领域

随着科技进步&#xff0c;嵌入式的出现&#xff0c;以及人们对生活质量&#xff0c;产品的智能化&#xff0c;成本的要求等&#xff0c;以及国家对与物联网、电子、科技的扶持&#xff0c;大量的电子产品都促使嵌入式的快速发展。使用嵌入式的产品如我们常用的手机、平板电脑、…

《2-数组》

数组 1.简介&#xff1a; 数组&#xff08;Array&#xff09;是一种固定长度的存储相同数据类型在连续内存空间中的数据结构 引出&#xff1a;[索引 &#xff08;Index&#xff09;]----元素在数组中的位置 2.初始化 写法&#xff1a;一般用到无初始值、给定初始值 在不给定…

拼多多笔试题(三):多多的电子字典

问题描述&#xff1a; 多多鸡打算造一本自己的电子字典&#xff0c;里面的所有单词都只由a和b组成。 每个单词的组成里a的数量不能超过N个且b的数量不能超过M个。 多多鸡的幸运数字是K&#xff0c;它打算把所有满足条件的单词里的字典序第K小的单词找出来&#xff0c;作为字典…

你觉得java与嵌入式学哪个好?

只要是现在选择嵌入式的学员&#xff0c;都是因为嵌入式未来发展好&#xff0c;薪资待遇好&#xff0c;那么java是不是也拥有这些特点呢&#xff1f;如果你还不了解这些的话&#xff0c;那么下面就要跟紧小编了&#xff0c;一起来了解下Java与嵌入式学哪个好吧。 点击获取1V1嵌…

嵌入式技术的前沿应用领域

嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;并且软硬件可剪裁&#xff0c;适用于应用系统对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系统 嵌入式系统在当下生活中应用非常广泛&#xff0c;应用于电信系统、电子类产品、医疗设备、智能家…

什么叫嵌入式开发 嵌入式开发的要求

嵌入式开发就是指在嵌入式操作系统下进行开发&#xff0c;常用的系统有wince&#xff0c;ucos&#xff0c;vxworks&#xff0c;linux&#xff0c;android等。 另外&#xff0c;用c&#xff0c;c或汇编开发&#xff1b;用高级处理器&#xff0c;arm7&#xff0c;arm9&#xff0…