字典(骚气的加上二叉排序树)

我就很奇怪,要建二叉排序树,你还要按照输入顺序来查单词,建树有个鬼用。题目如下:

这道题我也是做了很久很久。能够写出来真的是经历了一点低谷。

#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最好还是把测试数据自己给带进去过一遍,这样就能反应出很多的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值