资源简介
这是我的数据结构课程设计,采用了KMP算法和键树算法统计单词数量
代码片段和文件信息
#include
#include
#include
#include
#include
#define N 3
//特征词个数
#define MAX 26
//字母种类
struct TrieNode//树的结点结构
{
int Count;
TrieNode *Child[MAX];//指向儿子结点
TrieNode()//每个结点的初始化
{
Count=0;
for (int i=0;i }
};
inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}
void Format(char *text)//把字符串中的大写改写成小写,去掉标点符号
{
int i=0j;
while(text[i])
{
while(!isalpha(text[i])&&text[i])
for(j=i;text[j];j++) text[j]=text[j+1];//去掉标点符号
if(text[i]>=‘A‘&&text[i]<=‘Z‘) text[i]=text[i]+‘a‘-‘A‘;//大写改写成小写
i++;
}
i=0;
}
int WordNumber(char *Article)
//统计文章总单词数
{
int Num=0;
char text[20];
ifstream f(Articleios::in);
if(!f)
{
cout<<“Cannot Open File.“; return 0;
}
while (f>>text)
{
Format(text);
if (text[0]) Num++;//计数器加1
}
f.close();
return Num;;
}
void TrieInsert(TrieNode *&rootchar *word)//向以root为根结点的树中插入串word
{
TrieNode *temp=root;
int i=0j=0;
if(temp==NULL)
{
temp=new TrieNode();
root=temp;
}
while(word[i])
{
j=word[i]-‘a‘;
if (!temp->Child[j]) temp->Child[j]=new TrieNode();//如果不存在,建新结点
i++;
temp=temp->Child[j];
if (word[i]==‘\0‘) temp->Count++;
}
}
int TrieSearch(TrieNode *rootchar *word)//查找
{
TrieNode *temp=root;
int i=0j=0ans;
if(temp==NULL) return 0;
while(word[i])
{
j=word[i]-‘a‘;
if (!temp->Child[j]) return 0;
i++;
temp=temp->Child[j];
if (word[i]==‘\0‘) ans=temp->Count;
}
return ans;
}
void Trie(TrieNode *&rootchar *Article)
{
char text[20]; //存放从小说文件读取的一行字符串
ifstream f(Articleios::in);
if (!f)
{
cout<<“Cannot Open File.“< }
while (f>>text)//如果还没到小说文件末尾
{
Format(text);
TrieInsert(roottext);
}
f.close();
return;
}
void GetNext(const char *T int *next)
//求模式串T的next函数值并存入数组next。
{
int j = 0 k = -1;
next[0] = -1;
while (T[j])
{
if (k == -1 || T[j] == T[k])
{
++j; ++k;
if (T[j]!=T[k]) next[j] = k;
else next[j] = next[k];
}// if
else k = next[k];
}// while
}//GetNext
int KMP(const char *Textconst char *Pattern)
//const 表示函数内部不会改变这个参数的值。
{
if(!Text || !Pattern || Pattern[0]==‘\0‘ || Text[0]==‘\0‘) return -1;//空指针或空串,返回-1。
int len=0;
const char * c=Pattern;
while(*c++) ++len;//字符串长度。
int *next=new int[len+1];
GetNext(Patternnext);//求Pattern的next函数值
int i=0j=0index=0;
while(Text[i]&&Pattern[j])
{
if(Text[i]==Pattern[j])
{
++i;// 继续比较后继字符
++j;
}
else
{
index += j-next[j];
if(next[j]!=-1) j=next[j];// 模式串向右移动
else
{
j=0;
++i;
}
}
}//while
delete []next;
if(!Pattern[j])
return index;// 匹配成功
else return -1;
}//KMP
int KMPSearch(char *Articlechar *keys)
//查找函数该函数是整个程序的重要部分,对于输入的每一个
//要查找的关键字从小说文件中逐行读取字符串查找
{
char text[20]; //存放从
- 上一篇:MFC写的录屏代码,保存格式为AVI
- 下一篇:图像内容识别缩放 源代码 C++
评论
共有 条评论