这题目真的彻底无语了,因为一个小错误,检查了半天,就是一个累加变量被我重复用了
悲剧呀,怪不得老是输出一些莫名其妙的东西
整体的话,这应该也算是基础的字典树吧,,就是读入数据有些技巧,嘿嘿,不过好像可以用map做哦
前面做过一道题,就是在一个串的末尾的节点处,标记一下,而这道题,在一个串的末尾处将该串对应 的英文插入
#include<string.h> #include<stdio.h> #include<stdlib.h> typedef struct node { node* next[26]; char str[10]; }*tree,t; tree root; char art[1010]; void insert(char *s1,char *s2) { tree p=root,newnode; for(;*s2!='\0';s2++) { int i=*s2-'a'; if(p->next[i]!=NULL) p=p->next[i]; else { newnode=(tree)malloc(sizeof(t)); for(int j=0;j<26;j++) newnode->next[j]=NULL;//就是这里,i跟j混用了,悲剧呀,查了好久都没查出来 strcpy(newnode->str,""); p->next[i]=newnode; p=newnode; } } strcpy(p->str,s1); } int find(char *s1) { tree p=root; for(;*s1!='\0';s1++) { int i=*s1-'a'; if(p->next[i]!=NULL) p=p->next[i]; else return 0; } if(strcmp(p->str,"")!=0)//若在字典中,则输出 { printf("%s",p->str); return 1; } else return 0; } int main() { int i,n; char s1[10],s2[10],s[10]; root=(tree)malloc(sizeof(t)); for(i=0;i<26;i++) root->next[i]=NULL; strcpy(root->str,""); gets(s); while(scanf("%s %s",s1,s2)!=EOF) { if(strcmp(s1,"END")==0) break; insert(s1,s2); } getchar(); while(gets(art)) { if(strcmp(art,"END")==0) break; char ss[15]=""; int k=0; for(i=0;i<strlen(art);i++)//这一步读入很有技巧 { if(!(art[i]<='z'&&art[i]>='a')) { ss[k]=0;//这里也蛮关键的,相当于将字符串末尾赋结束标志 int flag=find(ss); if(!flag)//如果字典中查不到,则直接输出 printf("%s",ss); k=0;//记得要重新赋值为0 printf("%c",art[i]); } else ss[k++]=art[i];//将除了标点符号之外的字母先单独保存,当遇到标点符号之类的就可以送入字典去查找了 } printf("\n"); } return 0; }