搜索树和例子

用途:在关键字的词频统计,序列的记录,是哈希树的一种

例子:

写一个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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值