• 大小: 6KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-05
  • 语言: C/C++
  • 标签: 键树,KMP  

资源简介

这是我的数据结构课程设计,采用了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]; //存放从

评论

共有 条评论

相关资源