gets(string)不能换成scanf("%s",string)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 26
char string[10000000];
struct TreeN{
struct TreeN *next[MAX];//分支
int n; //记录经过节点的次数,即以该节点为前缀的单词个数;
};
struct TreeN *root;
void insert(char *str)
{
int len,i,j;
struct TreeN *p,*q; //p是指向当前节点的指针,每次插入新的字典单词时都从根节点开始,q是建立新节点的申请指针;
p=root; //因为要从根节点开始,因此把根节点赋给p;
len=strlen(str);
for(i=0;i<len;i++) //把当前单词的每个字母都插入到字典树中
{
if(p->next[str[i]-'a']) //如果当前节点已存在,不为空,说明有其他的单词的前缀中有他,则,继续往下插,并且当前次数+1,
{
p=p->next[str[i]-'a']; //p指向下一个节点;
p->n++;
}
else
{
q=(struct TreeN*)malloc(sizeof(struct TreeN)); //否则为当前节点申请空间;
p->next[str[i]-'a']=q;
p=q; //p指向新的节点
for(j=0;j<MAX;j++)
p->next[j]=NULL; //初始化当前节点的next分支
p->n=1; //初始化当前节点的次数为1.
}
}
}
int find(char *str)
{
int len,i,j;
len=strlen(str);
struct TreeN *p;
p=root; //从根节点开始查找
for(i=0;i<len;i++)
{
if(p->next[str[i]-'a']) //如果当前单词的字母在字典树中能找到,则继续向下匹配,直至把当前单词的每个字母都匹配完;
p=p->next[str[i]-'a'];
else return 0; //如果中间又一次不匹配,则匹配失败返回;
}
return p->n; //返回最后一次匹配节点的n值;
}
int main()
{
int i,j;
root=(struct TreeN*)malloc(sizeof(struct TreeN));//建立根节点;
for(i=0;i<MAX;i++)
root->next[i]=NULL; //初始化根节点的分支节点;
root->n=-1; //初始化根节点的次数为-1(因为根节点不存字母)
while(gets(string),strcmp(string,"")!=0)
insert(string); //建立字典树;
while(scanf("%s",string)!=EOF)
{
i=find(string); //查找以该单词为前缀的字典单词的个数;
printf("%d\n",i);
}
return 0;
}