用途:在关键字的词频统计,序列的记录,是哈希树的一种
例子:
写一个long文档,在里面查找单词。
#include<stdio.h>
#include<stdlib.h>
#define DESC_SIZE 256
#define kEY_SIZE 256
#define BUFSIZE 512
#define FNAME "log"
#include<string.h>
struct node_st {
struct node_st *ch[26]; //定义单词和大小
char desc[DESC_SIZE]; //定义des和大小
};
int get_word(FILE *fp,char *key,char *desc) { //获取单词
int i,j;
char buf[BUFSIZE]; //用buf来读取空间内容
char *retp;
while(1) {
retp = fgets(buf, BUFSIZE, fp);// 用Buf来读BUFSIZE的fp里
if(retp == NULL) {
return -1;
}
for(i =0; i < kEY_SIZE -1 && buf[i] != ':';i++) {
key[i] = buf[i];
}
key[i] = '\0';
i++;
for(j = 0; j < DESC_SIZE-1 && buf[i] != '\0';j++,i++) {
desc[j] = buf[i];
}
desc[j] = '\0';
return 0;
}
}
struct node_st*newnode(void)
{
int i;
struct node_st*node;
node = malloc(sizeof(*node));
if(node == NULL)
return NULL;
node->desc[0] = '\0';
for(i = 0;i < 26; i++)
node->ch[i] = NULL;
return node;
}
int insert(struct node_st**root,char *key,char *desc)
{
if(*root == NULL)
{
*root = newnode();
if(*root == NULL)
return -1;
}
if(*key == '\0')
{
strcpy((*root)->desc,desc);
return 0;
}
return insert((*root)->ch+*key-'a',key + 1,desc);
}
char *find(struct node_st*root,char *key)
{
if(root == NULL)
return NULL;
if(*key == '\0')
return root->desc;
return find(root->ch[*key-'a'],key+1);
}
int main()
{
FILE *fp; //定义一个指针
int ret;
struct node_st* tree = 0;
char desc[DESC_SIZE] = {'\0'},key[kEY_SIZE] = {'\0'}; //定义单词和描述分开
char *datap;
fp = fopen(FNAME,"r"); //以读的形式打开文件
if(fp == NULL) { //判断指针是否为空
fprintf(stderr,"fopen():erro!\n");
exit(1);
}
while(1)
{
ret = get_word(fp,key,desc); //获取单词:从那个文件,获取什么信息
if(ret == -1)
break;
insert(&tree,key,desc);
// puts(key);
// puts(desc);
}
datap = find(tree,"monkey");
if(datap == NULL)
printf("can not find\n");
else
puts(datap);
fclose(fp); //关闭指针
exit(0);
}
代码运行:
a animal with short legs and long ears