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

ofstream//文件写操作 内存写入存储设备ifstream//文件读操作,存储设备读取到内存中fstream//读写操作,对打开的文件可进行读写操作void open(const char* filename,int mode,int access);参数:filename:要打开的文件名mode:要打开文件的方式access:打开文件的属性打开文件的方式在类ios(是所有流式I/O类的基类)中定义.常用的值如下:ios::app:以追加的方式打开文件ios::ate:文件打开后定位到文件尾,ios:app就包含有此属性ios::binary: 以二进制方式打开文件,缺省的方式是文本方式 。两种方式的区别见前文ios::in:文件以输入方式打开(文件数据输入到内存)ios::out:文件以输出方式打开(内存数据输出到文件)ios::nocreate: 不建立文件,所以文件不存在时打开失败ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败ios::trunc:如果文件存在,把文件长度设为0*/#include#include#include#include#include#include#includeusing namespace std;using namespace chrono; //使用命名空间chrono//常量const int MaxSize = 1000; //文章单词最大容量const char* file = "file.txt"; //待检索文件static int sum = 0; //单词总数(不重复)// 结构体// 词频顺序存储结构struct WordFrequency { //词频string word; //单词int frequency; //频率int key; //关键码}WF[MaxSize];typedef WordFrequency datatype; //为数据类型定义一个新的名字//词频链式存储结构struct Node {datatype data; //数据域Node* next; //指针域};//二叉排序树链式存储结构struct BiNode {datatype data; //节点数据域BiNode* lchild, * rchild; //左右孩子指针};//ReadFile函数声明int StatisticalWord(string word); //统计文章词频(去掉重复单词)string WordTransition(string word); //大写英语单词转化成小写int WordJudge(string word); //判断单词中是否有大写字母void StatisticsData(); //数据统计intWordTransitionKey(string word); //将单词转换为唯一关键码//LinkedListMenu函数声明void ListMenu(); // 线性表菜单void SequenceMenu(); //顺序查找菜单void SeqListMenu(); //顺序表顺序查找菜单void WorLocatMenu();//顺序表单词查找菜单void LinklistSeqMenu();//链表顺序查找菜单void LinklistLocateMenu(); //链表单词查找菜单void HalfSortMenu(); //顺序表折半查找菜单void HalfdLocateMenu(); //顺序表折半单词查找菜单//BiTreeMenu函数声明void BiTreeMenu(); // 二叉排序树菜单void BitreeLocateMenu(); //二叉排序树的顺序查找菜单void BitreeWordLocMenu(); //二叉排序树查找单词菜单//HashTableMenu函数声明void HashMenu(); //哈希表菜单void OpenHashLocateMenu(); //开放地址法哈希查找菜单void OpenHashLocate(); //开放地址法哈希查找void LinkHashLocate(); //链地址法哈希查找void LinkHashWordLocateMenu(); //开放地址法哈希查找菜单void MajorMenu(); //主菜单#endif // !_HEAD_H
2、读入文件
// 读取TXT内容并整理//统计文章词频(去掉重复单词)int StatisticalWord(string word) {for (int i = 0; i < MaxSize; i++) { //循环控制,单词查重if (WF[i].word == word) { //单词重复WF[i].frequency++; //词频+1return i; //退出函数} //if} //for//单词不重复WF[sum].word = word; //添加单词WF[sum].frequency = 1; //词频置为一WF[sum].key = WordTransitionKey(word); //添加关键码sum++; //单词总数+1return 0;}//大写英语单词转化成小写string WordTransition(string word) {for (int i = 0; i < int(word.size()); i++) { //获取字符串长度,使用length()也可以if (word[i] >= 'A' && word[i] <= 'Z') //判断字符是否是大写字母word[i] = word[i] + 32; //ASCII码表中十进制 A==65a==97中间相差32,后面的也是如此} //forreturn word; //返回小写单词}//判断单词中是否有大写字母int WordJudge(string word) {for (int i = 0; i < int(word.size()); i++) {if (word[i] >= 'A' && word[i]