Trie树
2016-05-17 11:18
323 查看
字典树用于单词统计,查询,非常有用。现在就Trie树给出C语言实现。
#include <stdio.h> #include <malloc.h> #define MAXN 26 struct Trie{ int count; //单词计数 int flag; // 1表示是单词,0表示不是单词 struct Trie *next[MAXN]; }; struct Trie *rt; //初始化Trie树 void trie_init(){ int i; rt = (struct Trie*)malloc(sizeof(struct Trie)); rt->count = 0; rt->flag = 0; for(i=0; i<MAXN; ++i) rt->next[i] = NULL; } //插入单词 void trie_insert(char *s){ int i; struct Trie *tmp = rt; for(s; *s!='\0'; ++s){ if(tmp->next[*s -'a'] == NULL){ struct Trie *cur = (struct Trie*)malloc(sizeof(struct Trie)); cur->count = 0; cur->flag = 0; for(i=0; i<MAXN; ++i) cur->next[i] = NULL; tmp->next[*s -'a'] = cur; } tmp->count++; tmp = tmp->next[*s -'a']; } tmp->flag = 1; tmp->count++; } //查询给定字符串前缀的单词数目 int trie_search(char *s){ struct Trie *tmp = rt; for(s; *s!='\0'; ++s){ if(tmp->next[*s -'a'] == NULL) return 0; tmp = tmp->next[*s -'a']; } return tmp->count; } //删除整个Trie树 void trie_del(struct Trie *root){ int i; for(i=0; i<MAXN; ++i){ if(root->next[i] != NULL) trie_del(root->next[i]); } free(root); } int main(){ int i, n, m; char ch[15]; FILE *fin; fin = fopen("input.txt", "r"); while(fscanf(fin, "%d", &n) != EOF){ trie_init(); for(i=0; i<n; ++i){ fscanf(fin, "%s", ch); trie_insert(ch); } fscanf(fin, "%d", &m); for(i=0; i<m; ++i){ fscanf(fin, "%s", ch); printf("%d\n", trie_search(ch)); } trie_del(rt); } return 0; }
相关文章推荐
- Swing的线程机制
- java.lang.OutOfMemoryError异常解决方法
- MySQL- SHOW TABLE STATUS命令
- mysql
- hadoop safemode 的设置
- Java日期转换SimpleDateFormat格式大全
- 解决Maven 默认jre1.5
- Dubbo-redis集群搭建
- mvc中模型对象中的元数据校验库
- Spring基础知识(9)-事务管理
- java 上传图片 并压缩图片大小
- 正则表达式
- HashMap与ConcurrentHashMap的区别
- C#使用SqlBulkCopy批量更新数据
- Android Studio你不知道的调试技巧
- 无重边有向连通图的强连通分量
- hive中的lateral view 用法详解上篇
- 3】Hanoi汉诺塔问题
- java引用webRoot下的文件
- 无奈