读书人

课程设计的有关问题!

发布时间: 2012-03-25 20:55:17 作者: rapoo

课程设计的问题!!!!
用字典树,给定一个单词,将单词表里以该单词为前缀的单词输出,给定单词本身也算!我用了递归的思想,当运行结果与答案不对啊,一下我的代码。

#include<stdio.h>
#include<string.h>
#include<malloc.h>

#define MAX 26
#define ERROR 0
#define OK 1
#define DICTARY 50 //单词中字符数量最大值

typedef struct TriNode
{
int count; //遍历到该节点出现的字符串个数
struct TriNode *next[MAX]; //指向孩子节点
}TriNode, *Tri;

Tri InitTri()
{
Tri T=NULL;
int i=0;
T=(Tri)malloc(sizeof(TriNode));
for(i=0;i<MAX;i++)
T->next[i] = NULL;
T->count=0;
return T;
}
void Insert(Tri T,char str[]) //查找一个单词在单词表中出现的次数
{
int len=strlen(str);
int i=0,c;
Tri p;
Tri t;
p=T;
for(i=0;i<len;i++)
{
c=str[i]-'a';
if(p->next[c]==NULL)
{
t=InitTri();
p->next[c]=t;
p=p->next[c];
}
else
{
p=p->next[c];
p->count++;
}
//p->count++;
}
}
void DFSS(Tri T,int i,char a[],int k) //递归
{
char c;
Tri p=NULL;
int j=0;
p=T;
c='a'+i;
a[k++]=c;
for(j=0;j<MAX;j++)
{
if((p->next[j])!=NULL&&p->next[i]->count==1)
{
DFSS(p->next[j],j,a,k);
break;
}
if((p->next[i])!=NULL&&p->next[i]->count!=1)
{
a[k-1]='\0';
k=k-1;
DFSS(p->next[j],j,a,k);
break;
}
}
}

void DFS(Tri T,int j,char zong[],FILE *fp3,int l) //输出相同前缀单词
{
char ch;
Tri p=NULL;
int i=0,k=0,v;
char a[DICTARY];
p=T;
ch='a'+j;
a[k++]=ch;
for(i=0;i<MAX;i++)
{
if((p->next[i])!=NULL&&p->next[i]->count==1)
{
DFSS(p->next[i],i,a,k);
break;
}
if((p->next[i])!=NULL&&p->next[i]->count!=1)
{
a[k-1]='\0';
k=k-1;
DFSS(p->next[i],i,a,k);
break;
}
}
a[k]='\0';
strcat(zong,a);
printf("%s\n",zong);
fprintf(fp3,"%s",zong);
fputc('\n',fp3);
}

void Searchqian(FILE *fp1,FILE *fp2,FILE *fp3,Tri T) //查找相同前缀单词,从给定文件录入。
{
Tri p=NULL;
char a[DICTARY],b[DICTARY],zong[DICTARY];//se[DICTARY];
int i=0,len,c,j=0,l=1,vo=0,vp=0;
p=T;
if((fp1=fopen("abcd.txt","r"))==NULL)
{
printf("文件vocabulary打不开\n");
}
if((fp2=fopen("TotPrefixWord.txt","r"))==NULL)
{
printf("文件TotPrefixWord打不开\n");
}
if((fp3=fopen("TotPrefixWord_Result.txt","w"))==NULL)
{
printf("文件TotPrefixWord_Result打不开\n");
}
while(!feof(fp1))
{
fscanf(fp1,"%s",a);
Insert(T,a);
}
fclose(fp1);
while(!feof(fp2))
{
fscanf(fp2,"%s",b);
len=strlen(b);
for(i=0;i<len;i++)
{
c=b[i]-'a';
p=p->next[c];
if(p==NULL)
{
vp=1;
break;
}
}
if(vp==1)
{
printf("CASE %d\n",l);
printf("\n");
fprintf(fp3,"%s %d","CASE",l);
fputc('\n',fp3);
}
else
{
printf("CASE %d\n",l);
printf("%s\n",b);
fprintf(fp3,"%s %d","CASE",l);
fputc('\n',fp3);
fprintf(fp3,"%s",b);
fputc('\n',fp3);
strcpy(zong,b);


for(j=0;j<MAX;j++)
{
if(p->next[j])
{
DFS(p->next[j],j,zong,fp3,l);
}
}
}
l++;
}
fclose(fp2);
fclose(fp3);
}
int main()
{
Tri T=NULL;
FILE *fp1=NULL,*fp2=NULL,*fp3=NULL;
T=InitTri();
Searchqian(fp1,fp2,fp3,T);
return 0;
}
abcd文件夹下的内容:
a
aa
ca
ab
aa
a
TotPrefixWord文件下内容
b
a
答案是TotPrefixWord_Result文件下内容为
CASE 1
CASE 2
a
aa
ab 我的跟给定答案不一样,单词a输出地是aa aab,b输出地是b。

[解决办法]
你的答案,和你的输入比较,是正确的。
你试一下把abcd文件夹的内容改成
aa
aab
b
cc
ca
cmd
试试
[解决办法]
有点乱!

读书人网 >C++

热点推荐