#include <iostream> #include <fstream>
#include <string>
using namespace std;
struct WordList
{
string word; //字符串
WordList *node;//结点
};
WordList* Creat() //创建单词链表, 返回链表头指针
{
//*****打开文件************
ifstream in_file;
in_file.open("word.txt");//源文件
if(in_file.fail())
return false;
//*******建表*************
WordList *head,*p1,*p2;
string word;
int line=0,npos=0;
head=NULL;
p1=new WordList; //创建第一个结点
in_file>>p1->word;
while(!in_file.eof())//没有读到文件结尾
{
if(head==NULL)
{
head=p1; //第一个结点p1作表头
}
else
{
p2->node=p1; // 不是第一个word的作结点
}
p2=p1;
p1=new WordList; //创建下一个结点
in_file>>p1->word;
p1->node=NULL;
}
delete p1;
return head;
}
bool IsAnagram(string str1,string str2) //是 "变位词",返回true
{
int str_length=0;
if(str1.length()!=str2.length()) //长度不相等必定不是变位词
return false;
str_length=str1.length();
char _str1[str_length];
strcpy(_str1,str1.c_str());
char _str2[str_length];
strcpy(_str2,str2.c_str());
//******变位词: 字符类型种类数相同,在word中出现的次数相同
for(int i=0;i<str_length;i++)
{
int str_n_1=0,str_n_2=0;
for(int j=0;j<str_length;j++)
{
if(_str1[j]==_str1[i])
str_n_1++;
if(_str2[j]==_str1[i])
str_n_2++;
}
if(str_n_1!=str_n_2)
return false;
}
return true;
}
void Seach(WordList *head,WordList word_anagram[1024],int &anagram_count)
{ //查找统计 "变位词",记录"变位词"及所在位置
//结果存入 anagram_statistics[]数组
WordList *head_temp;
int count=0,line=0,npos=0;
head_temp=head;
if(head==NULL)
return ;
while(head_temp!=NULL)
{
WordList *find_anagram;
find_anagram=head_temp;
bool head_first=true;//标志head_temp->word值没有给 word_anagram[]
while(find_anagram->node!=NULL)
{
if(IsAnagram(head_temp->word,find_anagram->node->word))//是anagram,则保存
{
if(head_first)
{
word_anagram[count++].word=head_temp->word;
head_first=false;
}
word_anagram[count++].word=find_anagram->node->word;
if(find_anagram->node->node!=NULL)
find_anagram->node=find_anagram->node->node;
}
find_anagram=find_anagram->node;
}
head_temp=head_temp->node;
}
anagram_count=count;
}
void Output(WordList word_anagram[1024],int anagram_count) //输出保存 anagram 处理结果
{
ofstream out_file;
out_file.open("save.txt");//完成任务,结果保存在save.txt
if(out_file.fail())
return ;
cout<<"完成任务,输出 变位词(anagram):"<<endl;
for(int i=0;i<anagram_count;i++)
{
out_file<<word_anagram[i].word<<endl;
cout<<word_anagram[i].word<<endl;
}
}
int main(int argc, char *argv[])
{
WordList *head=NULL,word_anagram[1024];
int anagram_count;
head=Creat(); //读取建表
Seach(head,word_anagram,anagram_count);//查找 变位词
Output(word_anagram,anagram_count);//输出 并保存在 save.txt中
system("pause");
return 0;
}
链表 变位词 anagram
最新推荐文章于 2021-01-30 05:30:35 发布