hdu 1671 Phone List(字典树)

知道bug的时候我眼泪掉下来。。。

我的第一道字典树,看了字典树的注意事项和实现方式,我写这道题的时候格外认真,就是奔着1A去的。结果这是几A来着?

第一遍写的时候提交MLA,我看了一下,是因为我释放内存的函数写的有问题,‘==’写成了‘=’。修改之后提交wa,这个我就想不明白了,我可是测试了很多组数据的。

之后又尝试性的做了一个小小地修改,再次提交还是wa。然后是各种思考bug,想了好久突然想到我是用数字输入的,这样的话前导0会被忽略掉。

我的1A就这么没了。

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define N 15
struct node
{
    node* a[10];
    int flag;
};
node *root;
int InsertTree(char *ss)
{
    int k,mark[15];
	int ln;
    ln=strlen(ss);
	k=0;
	int i;
	for(i=ln-1;i>=0;i--)
		mark[k++]=ss[i]-'0';
    node *cur=root;
    node *s;
    int flag=0;
    for(i=k-1;i>=0;i--)
    {
        if(i!=0)
        {
            if(cur->flag==1)
            {
                flag=1;
                break;
            }
            if(cur->a[mark[i]]!=NULL&&cur->a[mark[i]]->flag!=1)
                cur=cur->a[mark[i]];
            else if(cur->a[mark[i]]!=NULL&&cur->a[mark[i]]->flag==1)
            {
                flag=1;
                break;
            }
            else
            {
                s=(node *)malloc(sizeof(node));
                memset(s->a,0,sizeof(s->a));
                cur->a[mark[i]]=s;
                s->flag=0;
                cur=s;
            }
        }
        else
        {
            if(cur->a[mark[i]]!=NULL)
            {
                flag=1;
                break;
            }
            else
            {
                s=(node *)malloc(sizeof(node));
                memset(s->a,0,sizeof(s->a));
                cur->a[mark[i]]=s;
                s->flag=1;
                cur=s;
            }
        }
    }
    return flag;
}
void Free(node *root)
{
    if(root->flag==1)
        free(root);
    else
    {
        int i;
        for(i=0;i<=9;i++)
        {
            if(root->a[i]!=NULL)
                Free(root->a[i]);
        }
        free(root);
    }
    return ;
}
int main()
{
    int T;
    scanf("%d",&T);
	char s[15];
    while(T--)
    {
        int n;
        scanf("%d",&n);
		getchar();
        root=(node *)malloc(sizeof(node));
        memset(root->a,0,sizeof(root->a));
        root->flag=0;
        int flag=0;
        while(n--)
        {
            int x;
            gets(s);
            if(InsertTree(s))
                flag=1;
        }
        if(flag)
            printf("NO
");
        else
            printf("YES
");
        Free(root);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/jiangu66/p/3199027.html