回 帖 发 新 帖 刷新版面

主题:[讨论]急求:用二叉排序树实现单词索引表

设计实现,测试并注释 C/C++程序,程序读入文本文件并构造该文件单词为关键字的索引表同时报告每个单词在文中出现的次数作为表的数据,一个链式二叉排序树被用来代表这个关键字列表,即把这些关键字及其出现次数存入结点中,因此树结点即包含关键字同时也包含次数计数,不考虑大小写字母情况下按字母顺序排序。 

程序把连续字母看成单词,其他符号则视为间隔号,大小写均视为相同如‘HOUSE’、‘House’、‘house’将被视为同一单词,另外程序只计算单词的前8个字母如"manipulated"和"manipulation"被看成"manipula"的两个实例

输入
用户从终端输入文件名(包括程序本身也可以作为输入的文件)


输出
文本文件单词索引表(如前所述)

错误信息
程序应能够处理任何文件而不需要侦测错误. 

实例 
如果输入的文本文件为: 
      This is a small
        test file, containing a small
      number of words.
      
则输出结果为: 
      Word          Count
      --------------------
      A                     2
      CONTAINI      1
      FILE                 1
      IS                     1
      NUMBER        1
      OF                   1
      SMALL            2
      TEST                1
      THIS                1
      WORDS          1
      --------------------
      The file contains 10 distinct words.

回复列表 (共2个回复)

沙发

本人写了一个程序,但出现了不知名的错误 !

苦恼之余恳请高手帮忙!


#include<fstream> 
#include<iostream>
#include<string>
using namespace std;
typedef struct tree{
        char* s;
        int  c;
        tree *l,*r;
        }node;

void creatree(node* &p,char* c)
{
  if(p==NULL)
  {
    p=new node;
    p->s=c;
    p->c=1;
    p->l=p->r=NULL;          
  }
  else if(strcmp(c,p->s)==0)
  p->c++;
  else if(strcmp(c,p->s)>0)
  creatree(p->r,c);
  else
  creatree(p->l,c);     
}

void inorder(node* p)
{
 if(p!=NULL)
 {
  inorder(p->l);
  cout<<p->s<<"   "<<p->c<<endl;
  inorder(p->r);           
 }     
}
        
int main()
{
 node* root=NULL;
 char  str[8],s[8],*p;
 int   i=0;
 ifstream text;
 text.open("d:\\nokia\\yymm.txt");
 if(!text)
 {
  cerr<<"Open error\n";
  exit(1);         
 }
 while(!text.eof())
 {
  text>>str;
  p=str;
  while(*p!='\0')
  {
   if('*p'<91)
   s[i]=*p;
   else
   s[i]='*p'-32;
   i++;   p++;               
  }
  s[i]='\0';
  creatree(root,s);
 }
  cout<<"words and counts:\n";
  inorder(root);
                

板凳

//这题本人最后解决了,今天再次光顾,心血来潮,将答案与大家分享一下吧

//数据结构_experiment4_单词索引表与二叉排序树 


#include<fstream> 
#include<iostream>
#include<string>

int k=0; 
using namespace std;
 
typedef struct tree{
        char s[8];
        int  c;
        tree *l,*r;
        }node;

void creatree(node* &p,char* ch)
{
  if(p==NULL)
  {
    p=new node;
    strcpy(p->s,ch);
    p->c=1;
    k++;
    p->l=p->r=NULL;          
  }
  else if(strcmp(ch,p->s)==0)
  p->c++;
  else if(strcmp(ch,p->s)>0)
  creatree(p->r,ch);
  else
  creatree(p->l,ch);     
}

void inorder(node* p)
{
 fstream  file;
 file.open("d:\\nokia\\ym.txt",ios::out|ios::app);
 if(!file)
 {
  cerr<<"Open error\n";
  exit(1);
 }        
 if(p!=NULL)
 {
  inorder(p->l);
  file<<p->s<<"\t\t"<<p->c<<endl;
  inorder(p->r);           
 }     
}
        
int main()
{
 node* root=NULL;
 char  *str,s[8],*p;
 int   i;
 fstream  myfile;
 myfile.open("d:\\nokia\\ym.txt",ios::out|ios::trunc);
 if(!myfile)
 {
  cerr<<"Open error\n";
  exit(1);
 }       
 ifstream text;
 text.open("d:\\nokia\\yym.txt");
 if(!text)
 {
  cerr<<"Open error\n";
  exit(1);         
 }
 while(!text.eof())
 {
  text>>str;
  if(*str<65||(*str>90&&*str<97)||*str>122)
  continue;
  p=str;
  i=0; 
  while((*p!='\0')&&(i<7))
  {
   if(*p>64&&*p<91)
   s[i]=*p;
   else if(*p>96&&*p<123)
   s[i]=-32+(*p);
   i++;   p++;               
  }
  s[i]='\0';
  creatree(root,s);
 }
 
 myfile<<"________________________\n";
 inorder(root);
 myfile<<"\nThe file contains "<<k<<" distinct words.";
 myfile<<"\n________________________\n\n";
 myfile<<"words"<<"\t\t"<<"counts:\n";
 myfile<<"________________________\n";
 myfile.close();
 return 0;               

我来回复

您尚未登录,请登录后再回复。点此登录或注册