我就很奇怪,要建二叉排序树,你还要按照输入顺序来查单词,建树有个鬼用。题目如下:
这道题我也是做了很久很久。能够写出来真的是经历了一点低谷。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct tree
{
char word[17];
struct tree *lchild,*rchild;
}tree,*bitree;
void check(char c[][17],int i)
{
char b[17];
int j,k,l,flag,m,p,q,w,y;
while(gets(b)!=NULL)
{
if(b[0]=='#') break;
flag=0;
for(j=0;j<i;j++)
{
if(!strcmp(c[j],b))
{
printf("%s is correct\n",b);flag=1;break;
}
}
if(!flag)
{
printf("%s:",b);
for(j=0;j<i;j++)
{
m=0;l=0;p=0;q=0;w=0;
if(strlen(b)==strlen(c[j]))
{
for(k=0;b[k]!='\0';k++)
{
if(b[k]!=c[j][k]) m++;
if(m>1) break;
}
}
else if(strlen(b)-strlen(c[j])==1) //删除一个字符
{
for(k=0,y=0;c[j][k]!='\0';k++,y++)
{
if(b[y]!=c[j][k]&&b[y+1]==c[j][k])
{
w++;
l++;
y++;
}
else if(b[y]==c[j][k]) l++;
}
if(l==strlen(c[j])&&w<=1)
{
p=1;
}
}
else if(strlen(c[j])-strlen(b)==1) //查询单词插入字符
{
for(k=0,y=0;b[k]!='\0'&&c[j][y]!='\0';k++,y++)
{
if(b[k]!=c[j][y]&&b[k]==c[j][y+1])
{
w++;
l++;
y++;
}
else if(b[k]==c[j][y])
{
l++;
}
}
if(l==strlen(b)&&w<=1)
{
q=1;
}
}
if(m==1||p==1||q==1)
{
printf(" %s",c[j]);
}
}
printf("\n");
}
}
}
void aftertraverse(bitree T)
{
if(T)
{
aftertraverse(T->lchild);
aftertraverse(T->rchild);
printf("%s ",T->word);
}
}
int main()
{
char c[10001][17],b[17];
int i=0,j,flag,k,m,a,d,x;
tree *p,*T,*p1,*pre;
T=NULL;
while(gets(c[i])!=NULL)
{
if(c[i][0]=='#') break;
i++;
}
p=(struct tree*)malloc(sizeof(tree)) ;
strcpy(p->word,c[0]);
p->lchild=NULL;p->rchild=NULL;
T=p;
for(j=1; j<i; j++)
{
p=T;
while(p)
{
if(strcmp(c[j],p->word)>0) //插入右子树
{
pre=p;
x=1;
p=p->rchild;
}
else if(strcmp(c[j],p->word)<0) //插入左子树
{
pre=p;
x=0;
p=p->lchild;
}
}
p1=(struct tree*)malloc(sizeof(tree));
strcpy(p1->word,c[j]);
p1->rchild=p1->lchild=NULL; //错误再此
if(x)
pre->rchild=p1;
else
pre->lchild=p1;
}
aftertraverse(T);
printf("\n");
check(c,i);
return 0;
}
差点压死骆驼的最后一根稻草是倒数十一行有标注的那一句话,我写成了
p1->rchild=p1->rchild=NULL;
HaHa……送你五个字:这都不是事,这么点小错误能有什么事。不过是有些能出结果,有些成了死循环。就这么花里胡哨的东西,我费了一个多小时。其实它还事有点作用的。就是我发现我平常有点喜欢用来改bug的方法是有问题的。
这个问题就是,我不是很需要动脑子。方法是,在觉得有问题的地方加入一组输出。其实本身是没有问题的就是我自己滥用了。
改bug最好还是把测试数据自己给带进去过一遍,这样就能反应出很多的问题。