主题:[讨论]急求:用二叉排序树实现单词索引表
飞啊啊飞
[专家分:0] 发布于 2008-06-15 12:21:00
设计实现,测试并注释 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个回复)
沙发
飞啊啊飞 [专家分:0] 发布于 2008-06-15 12:25:00
本人写了一个程序,但出现了不知名的错误 !
苦恼之余恳请高手帮忙!
#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);
}
板凳
飞啊啊飞 [专家分:0] 发布于 2008-07-05 20:40:00
//这题本人最后解决了,今天再次光顾,心血来潮,将答案与大家分享一下吧
//数据结构_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;
}
我来回复