博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

zxg623

只为伊人守侯 和我共同营造苍凉的远方 醉解千愁,他处不堪留 我冷因为我看到世界的冷漠,我傲因为孤独的灵魂漂泊于芸芸众生之上,我酷因为没被事故磨去棱角,我狂因为愿意用生命去追求理想,我痴因为还相信爱情的魔力 我的笑隐约透露着孤独,快乐背后深深藏着痛楚,坚强的面对然后偷偷的哭.......
  zxg623.cublog.cn

关于作者
姓名:zxg623
职业:嵌入式
年龄:25
位置:中国·深圳
个性介绍:
|| << >> ||
我的分类


字典树实现源代码

由字母a~z所组成的字符串的一个集合中,各个字符的长度之和为n。设计一个O(n)时间的算法,将这个集合中所有字符串依字典进行排序。注意,这里可能存在非常长的字符串。
  
#include <stdio.h>
#include <malloc.h>

typedef struct tire
{
   struct tire *next[26];
   char date;
   int cnt;
}*_tire;

void init_tire(_tire root, char *string)
{
    _tire s;
    s=root;
    
    while(*string!='\0')
    {
       if(s->next[*string - 'a']==NULL)
       {
          s->next[*string - 'a'] = (_tire)malloc(sizeof(struct tire));
          (s->next[*string - 'a'])->date = *string;
          s = s->next[*string - 'a'];
          for(int i=0;i<26;i++)
          {
              s->next[i] = NULL;
          }
       }
       else
       {
          s = s->next[*string - 'a'];
       }
       string++;
    }
    s->cnt=1;
}

void print(_tire root, char *s, int i)
{
    int j;
    s[i] = root->date;

    if(root->cnt==1)
    {
        s[i+1] = 0;
        puts(s);
    }
    
    for(j=0;j<26;j++)
    {
        if(root->next[j]!=NULL)
        {
           print(root->next[j],s,i+1);
        }
    }

}

int main()
{
    _tire root;
    int m,i;
    char s[265];
    
    root = (_tire)malloc(sizeof(struct tire));
    puts("输入字符串个数:");
    for(i=0;i<26;i++)
    {
       root->next[i]=NULL;
    }
    scanf("%d",&m);
    getchar();
    while(m--)
    {
       gets(s);
       init_tire(root,s);
    }
    puts("\n依字典排序后:");
    for(i=0;i<26;i++)
    {
       if(root->next[i] != NULL)
       {
          print(root->next[i],s,0);
       }
    }
    return 0;
}


发表于: 2008-04-11,修改于: 2008-04-11 00:34,已浏览134次,有评论0条 推荐 投诉


网友评论
 发表评论