刚开始对字典树理解为0,感觉应该是相当困难的东西,于是心理上就没有做的想法了,不过庆幸的是,比赛出了字典树,于是赛后硬着头皮去理解,感觉倒有点好了,这道题倒是字典树里比较简单的题了,作为小试身手的第一个了:

View Code
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int n; ////这里是代表有某个节点的字符串数
struct node *child[26]; ////字典树嘛,26个字母;
}Lnode,*Link; ///建立链表习惯,就延续下来了
Link root;
int m=sizeof(Lnode);

void Insert(char str[]) ///建立起字典树
{
int i,j,len;
Link s,t;
len=strlen(str);
if(len==0)
return;
s=root;
for(i=0;i<len;i++)
{
if(s->child[str[i]-'a']!=0)
{
s=s->child[str[i]-'a'];
s->n=s->n+1;
}
else
{
t=(Link)malloc(m); ///这个就是组建过程,
for(j=0;j<26;j++)
t->child[j]=0;
s->child[str[i]-'a']=t; ///这个是正确的,把新开辟的空间,连在刚刚的地方;
s=t; ///这个也是,主要在进行过程中用的是s处理的,这里把t赋给s
s->n=1; ///当某个节点有字母时,就可以加1;
}
}
}
int find(char str[]) ///搜索过程
{
Link s;
int i,len;
len=strlen(str);
if(len==0)
return 0;
s=root;
for(i=0;i<len;i++)
{
if(s->child[str[i]-'a']!=0) ///找到的话自然顺着str往下找
s=s->child[str[i]-'a'];
else
return 0; ///有一个不存在,说明字典树不存在str这样的为前缀的
}
return s->n;
}
int main()
{
char str[15];
int i;
root=(Link)malloc(m);
for(i=0;i<26;i++)
root->child[i]=0;
while(gets(str),strcmp(str,"")!=0)
Insert(str);
while(gets(str))
{
i=find(str);
printf("%d\n",i);
}
return 0;
}

  

  

posted on 2011-08-18 09:20  world_ding  阅读(186)  评论(0编辑  收藏  举报