数据结构 C++实现 基于不同策略的英文单词的词频统计和检索系统( 六 )

<< endl;cout << "---基于顺序表的折半查找---" << endl;cout << "1.词频统计" << endl;cout << "2.单词查找" << endl;cout << "3.返回上一级" << endl;cout << "请按相应的数字键进行选择:" << endl;int n;cin >> n;switch (n){case 1:L.PrintList(2); //折半查找,输出break;case 2: HalfdLocateMenu(); //折半查找break;case 3:return; //退出函数default: cout << "输入的不是有效符号,请重新输入" << endl; system("pause"); //暂停} //switch} //while}//顺序表折半查找菜单void HalfdLocateMenu(){SeqList L(WF, sum);system("cls"); //清屏cout << "*******************基于不同策略的英文单词的词频统计和检索系统*******************" << endl;cout << "---折半单词查找---" << endl;cout << "请输入要查找的单词:";string word;cin >> word;auto start = system_clock::now(); //开始时间L.BinSearch(word);duration diff = system_clock::now() - start; //现在时间 - 开始时间int i = L.BinSearch(word); //返回下标if (i >= 0) {cout << "此单词为:" << L.getword(i) << endl;cout << "此单词的词频:" << L.getfre(i) << endl;cout << "查找该单词所花费的时间:" << (diff.count())*1000 << "毫秒" << endl;cout << "平均查找长度:" << double((log(double(sum) + 1) / log(2)) - 1) << endl;} //ifelsecout << "查找失败" << endl;system("pause"); //暂停}
6、二叉排序树类
//二叉排序树类class BiSortTree {public:BiSortTree(datatype a[], int n); //带参构造函数,对树初始化~BiSortTree() { //析构函数Release(root);}BiNode* InsertBST(datatype data) { //函数重载,插入数据域datareturn InsertBST(root, data);}BiNode* SearchBST(string word) { //函数重载,查找值为word的结点return SearchBST(root, word);}void printf(); //输出函数private:void Release(BiNode* bt); //释放空间BiNode* InsertBST(BiNode* bt, datatype data); //插入数据域dataBiNode* SearchBST(BiNode* bt, string word); //查找值为word的结点void InOrder(BiNode* bt); //中序遍历函数调用BiNode* root; //二叉排序树的根指针};//构造函数BiSortTree::BiSortTree(datatype a[], int n) {root = NULL; //根指针置空for (int i = 0; i < n; i++)root = InsertBST(root, a[i]); //遍历,插入数据}//输出函数voidBiSortTree::InOrder(BiNode* bt) { //递归输出二叉排序树ofstream fout; //文件写操作 内存写入存储设备fout.open("outfile4.txt", ios_base::out | ios_base::app); //打开文件并将内容追加到文件尾if (bt == NULL) //递归调用的结束条件,根指针为空return; //退出函数else {InOrder(bt->lchild); //中序递归遍历bt的左子树cout << bt->data.frequency << "\t" << bt->data.word << endl; //访问根结点bt的数据域,输出到屏幕fout << bt->data.frequency << "\t" << bt->data.word << endl; //访问根结点bt的数据域,输出到文件fout.close(); //关闭文件InOrder(bt->rchild); //中序递归遍历bt的右子树} //else}//输出二叉排序树到屏幕和outfile4.txtvoid BiSortTree::printf() {system("cls"); //清屏ofstream fout; //文件写操作 内存写入存储设备fout.open("outfile4.txt");//打开文件fout << "单词总数为:" << sum << endl;fout << "词频" << "\t" << "单词" << endl;InOrder(root); //输出函数system("pause"); //暂停return; //退出函数}//递归查找函数,返回指针BiNode* BiSortTree::SearchBST(BiNode* bt, string word) {if (bt == NULL)return NULL; //未找到,返回NULLif (bt->data.word == word)return bt; //找到word,返回该指针else if (bt->data.word > word) //数据大于wordreturn SearchBST(bt->lchild, word); //递归查找左子树else //数据小于wordreturn SearchBST(bt->rchild, word); //递归查找右子树}//递归插入函数BiNode* BiSortTree::InsertBST(BiNode* bt, datatype data) {if (bt == NULL) { //找到插入位置BiNode* s = new BiNode; //生成一个新的储存空间s->data = http://www.kingceram.com/post/data; //为数据域赋值s->lchild = NULL; //左孩子指针置空s->rchild = NULL; //右孩子指针置空bt = s; //根指针更新return bt; //返回根指针} //ifelse if (WordTransition(bt->data.word) > WordTransition(data.word)) { //根节点数据大于要插入的数据bt->lchild = InsertBST(bt->lchild, data); //更新左孩子指针return bt; //返回根指针} //else ifelse { //根节点数据小于要插入的数据bt->rchild = InsertBST(bt->rchild, data); //更新有孩子指针return bt; //返回根指针} //else}//递归析构函数void BiSortTree::Release(BiNode* bt) {if (bt == NULL)return; //根指针为空直接退出else {Release(bt->lchild); //释放左子树Release(bt->rchild); //释放右子树delete bt; //释放根结点}}