文本文件单词统计的排序树方式实现

    技术2022-05-20  34

    现在提供一个排序树的应用。对文本文件的单词数量统计,源代码如下,在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); }}


    最新回复(0)