二叉排序树实现英文文章单词统计

二叉排序树实现英文文章中目标单词统计


【输入形式】

打开当目录下文件C:\Users\Administrator\Desktop\essay.txt,从中读取英文单词进行词频统计。输入单词查询个数和单词。

【输出形式】

输入一个单词按一下enter键,输出单词统计个数,输出一个单词及其出现次数,单词和其出现次数间由一个空格分隔,出现次数后无空格,直接为回车。

存储结构设计

typedef struct node{
	int flag;
	int count;
	char word[26];
	struct node *lchild, *rchild;  
}BTNode, *BTREE; 
其中单词保持在Word数组中,建立节点的时候 每个节点有左孩子和右孩子 ,count记录单词出现数量

程序源文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define M 5000
typedef struct node{
	int count;
	char word[26];
	struct node *lchild, *rchild;  //建立节点的时候 每个节点有左孩子和右孩子
}BTNode, *BTREE;

int flag;
int times = 0;
int get_word(char *temp_word, FILE *in);
BTREE insert(BTREE T, char temp_word[]); // remember to return a pointer so it can change its real address
void inorder(BTREE root,char word[]);

int main()//主函数入口
{
	char temp_word[26] = {0}; /*prepare to put the content of temp_word to real wordblock.word*/
	char words[26] =  {0};
	int number;
   	FILE *in;
    int i,j;
	if( (in = fopen("C:\\Users\\wpf\\Desktop\\essay.txt", "r")) == NULL )//打开文件
    printf("No such file!\n");
    BTREE root = NULL;        //每次insert 都是把根节点当作参数传进去的
	while( !feof(in) )//判断文件是否为空
	{
		char temp_word[26] = {0};
		get_word(temp_word,in);//从文件中找到一个单词保存在数组temp_word中
		root = insert(root, temp_word);//构建二叉排序树,根节点为root
	}
	printf("\n*******************************************************************************\n");   //格式控制?
	printf("\n                           欢迎使用--文学研究助手。					      \n");
	printf("*******************************************************************************\n\n");
    printf("你想查询单词的数量是:");
	scanf("%d",&number);
	for (int i=0;i<number+1;i++)
	{
	    if(i>0) printf("请输入目标单词;");
		gets(words);
		char a[strlen(words)+1];
		strcpy(a,words);
		if(i>0)
		{
		    inorder(root,a);
			if(flag==0)
			{
				printf("单词%s在文章出现次数为 %d\n\n", a, 0);
				flag=0;
			}

		}
	}
	return 0;
}

int get_word(char *temp_word, FILE *in)// 从文件中找到一个单词 保存在中数组
{
	int i = 0;
    char temp = '0';
    temp = fgetc(in);//从文件中得到一个字符
	while( !isalpha(temp) )//当有字符时
    {
		temp = fgetc(in);
		if(temp==EOF)//字符为空格
		return 1;//返回
	}
	while(isalpha(temp) && !isspace(temp) )//有字符且字符不为空格
	{
		temp = tolower(temp);
		temp_word[i] = temp;//把字符保存在temp_word中
		i++;
		temp = fgetc(in);
	}

    return 0;
}

BTREE insert(BTREE p, char temp_word[])//创建二叉排序树
{
	int cond;
	if(p == NULL)//如果节点p为空
	{
		p = (BTREE)malloc(sizeof(BTNode));//给节点p分配空间
		strcpy(p->word, temp_word);//把字符串temp_word复制到节点p保存单词数组中
		p->count = 1;//记录单词数量为1
		p->lchild = p->rchild = NULL;//p的左孩子右孩子为空
	}
	else if( (cond  = strcmp(temp_word, p->word)) == 0)//目标单词temp_word和 p->word想等
	{
		p->count++;//p->word数量加一
	}
	else if( cond<0 )//目标单词temp_word第一个字母比p->word第一个字母小
	{
		p->lchild = insert(p->lchild, temp_word);//把目标单词插入到p左孩子中
	}
	else//目标单词temp_word第一个字母比p->word第一个字母大
	{
		p->rchild = insert(p->rchild, temp_word);//把目标单词插入到p右孩子中
	}
	return (p);
}

void inorder(BTREE T, char word[])  //二叉树中序遍历 ,找到目标单词,输出 目标单词个数
{
	 if(T!= NULL)
    {
    	inorder(T->lchild,word);
    	if(strcmp(word, T->word)==0)
		{
    		printf("单词%s在文章出现次数为 %d\n\n", T->word, T->count);
    		flag=1;
		}
    	inorder(T->rchild,word);
	}
}

运行结果
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值