现在提供一个排序树的应用。对文本文件的单词数量统计,源代码如下,在vc6.0环境测试通过
排序树的基础知识请参见《软件技术基础》电子科技大学出版社
#include "stdio.h"
#include "stdLib.h"
#include "string.h"
#include "assert.h"
#define MAXWORDLEN 30 /*单词最大字母数量*/
typedef struct sort_tree
{
char word[MAXWORDLEN];
int count;
struct sort_tree *left;
struct sort_tree *right;
}BNODE;
BNODE *sortTree = NULL;
int cnt = 0;
void ins_Bstree(BNODE **proot,char * word);
BNODE * ser_Bstree(BNODE **proot,char *word,char *l_r);
void in_Order(BNODE * proot);
void main()
{
FILE * pin;
char temp[MAXWORDLEN] = {'/0'};
char charIn;
int i = 0;
int wordFlag=0;
pin = fopen("word.txt","r");
if(pin == NULL)
{
printf("文件打开错误!!!/n");
return;
}
while(!feof(pin))/*未到文件末*/
{
charIn = fgetc(pin);
if((charIn >= 'A' && charIn <= 'Z')||(charIn >= 'a' && charIn <= 'z') )
{
if(i>=MAXWORDLEN)
printf("文件中有超过30个字母的单词!!!");
assert(!(i >= MAXWORDLEN));
temp[i++] = charIn;
wordFlag = 1;
}
else
{
if(wordFlag == 1)
{
ins_Bstree(&sortTree,temp);
memset(temp,'/0',MAXWORDLEN);
i=0;
wordFlag = 0;
}
}
}
printf(" 欢迎使用单词统计工具 /n");
printf(" 作者 malamute; blog: http://malamute.blog.sohu.com/")
printf(" word count /n");
printf("-----------------------------------------------------/n");
in_Order(sortTree);
}
/*根据ser_Bstree函数的结果来对最近读入单词进行计数或者插入操作*/
void ins_Bstree(BNODE ** proot,char * word)
{
BNODE *p;
char l_r = 0;
BNODE * result;
result = ser_Bstree(proot,word,&l_r);
p = (BNODE *)malloc(sizeof(BNODE));
if(p == NULL)
{
printf("p 分配错误!!!");
return;
}
p->count=1;
p->left = NULL;
p->right = NULL;
if(*proot == NULL)
{
*proot = p;
strcpy((*proot)->word,word);
// printf("cnt = %d/n",++cnt);
return;
}
if(result != NULL)
{
switch(l_r)
{
case 0 :
break;
case 1 :
result->left = p;
strcpy(p->word,word);
//printf("cnt = %d/n",++cnt);
break;
case 2 :
result->right= p;
strcpy(p->word,word);
//printf("cnt = %d/n",++cnt);
break;
}
}
return;
}
/*在排序二叉树中查找是否有相同单词,若找到对应计数值加1,否则判断该放在当前排序二叉树叶子节点的左子树还是右子树*/
/*返回值:找到则返回此单词的节点*/
/*找不到则返回叶子节点,*/
/* l_r 表示需要添加到左子树还是右子树*/
BNODE * ser_Bstree(BNODE **proot,char *word,char *l_r)
{
BNODE * p;
//int endFlag = 0;
if(*proot == NULL)
return NULL;
p = *proot;
while(1)
{
if(strcmp(p->word,word) == 0) /*找到相同单词,计数值加1*/
{
p->count++;
return p;
}
else if(strcmp(p->word,word) > 0)
{
if(p->left == NULL)
{
*l_r =1;
return p;
}
else p = p->left;
}
else if(strcmp(p->word,word) < 0)
{
if(p->right== NULL)
{
*l_r= 2;
return p;
}
else p = p->right;
}
}
}
/*中序遍历排序二叉树*/
void in_Order(BNODE * proot)
{
int len;
if(proot == NULL)
return;
else
{
in_Order(proot->left);
printf("%s",proot->word);
len = MAXWORDLEN+10 - strlen(proot->word);
while(len--)
printf(" ");
printf("%d/n",proot->count);
in_Order(proot->right);
}
}