链表 变位词 anagram

来源:互联网 发布:java 照片分析 编辑:程序博客网 时间:2024/04/27 22:14
#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;
}