C语言用二叉树统计一个源文件中每个单词的次数

由于出现的单词不确定,所以用二叉树实现:

//TreeNode.h

typedef struct _TreeNode
{
     int count; //出现的次数
     char* word;//单词本身 
     struct _TreeNode* left;
     struct _TreeNode* right; 
        
}TreeNode;

//给TreeNode分配内存 
TreeNode* talloc(void)
{
   return (TreeNode*)malloc(sizeof(TreeNode));       
}

//打印tree 
void tprint(TreeNode* root)
{
     //打印left->self->right
     if(root!=NULL)
     {
         tprint(root->left);
         printf("%4d %s\n",root->count,root->word); 
         tprint(root->right);               
     }
}

//把单词添加节点的合适位置 
TreeNode* addNode(TreeNode* node,const char* word)
{
    int con;      
    TreeNode* tmp; 
    if(node==NULL)
    {
        node = talloc();
        node->count=1;            
        node->word=strdup(word);
        node->left=node->right=NULL;
    }else if((con=strcmp(word,node->word))<0)
    {
       tmp = addNode(node->left,word);
       node->left=tmp;   
    }else if(con>0)
    {
       tmp = addNode(node->right,word);  
       node->right=tmp;   
    }else{
       node->count++;   
    }   
    return node;
}
/**
从指定的流中读取单词 
*/
int getWord(char* ch,size_t n,FILE* f)
{
   int c;
   char* p = ch;
   while(isspace(c=fgetc(f)))
         ;
  if(c!=EOF)
       *p++=c;
  if(!isalpha(c))
  {
     *p='\0';            
     return c;
  }
  for(;--n>0;p++)
  {
     if(!isalnum(*p=fgetc(f)))
     {              
        ungetc(*p,f);                       
        break;
     }            
  }
   *p='\0';
   return c;     
                
}
//是否tree占用的内存 
void treeFree(TreeNode* root)
{
   if(root!=NULL)
   {
      treeFree(root->left);           
      free(root->word); //释放节点的word占用的内存 
      free(root);       //是否节点占用的内存         
      treeFree(root->right);           
   }  
}
//Test.c
#include <stdio.h>
#include <stdlib.h>
#include "TreeNode.h"

#define MAX 100
int main(int argc, char *argv[])
{
  FILE* f;
  char w[MAX]={0};
  char* fname="TreeNode.h";
  if((f=fopen(fname,"r"))!=NULL)
  {
    TreeNode* root = NULL;
    while((getWord(w,MAX,f)!=EOF))
     {
          if(isalpha(w[0]))
              root = addNode(root,w);                        
     }
    tprint(root); 
    treeFree(root);                            
    fclose(f);                                   
  }else{
         printf("open %s error\n",fname);  
 }
  getchar();	
  return 0;
}



  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值