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


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

  1. //TreeNode.h  
  2.  
  3. typedef struct _TreeNode 
  4.      int count; //出现的次数  
  5.      char* word;//单词本身   
  6.      struct _TreeNode* left; 
  7.      struct _TreeNode* right;   
  8.          
  9. }TreeNode; 
  10.  
  11. //给TreeNode分配内存   
  12. TreeNode* talloc(void
  13.    return (TreeNode*)malloc(sizeof(TreeNode));         
  14.  
  15. //打印tree   
  16. void tprint(TreeNode* root) 
  17.      //打印left->self->right  
  18.      if(root!=NULL) 
  19.      { 
  20.          tprint(root->left); 
  21.          printf("%4d %s\n",root->count,root->word);   
  22.          tprint(root->right);                 
  23.      } 
  24.  
  25. //把单词添加节点的合适位置   
  26. TreeNode* addNode(TreeNode* node,const char* word) 
  27.     int con;       
  28.     TreeNode* tmp;   
  29.     if(node==NULL) 
  30.     { 
  31.         node = talloc(); 
  32.         node->count=1;             
  33.         node->word=strdup(word); 
  34.         node->left=node->right=NULL; 
  35.     }else if((con=strcmp(word,node->word))<0) 
  36.     { 
  37.        tmp = addNode(node->left,word); 
  38.        node->left=tmp;     
  39.     }else if(con>0) 
  40.     { 
  41.        tmp = addNode(node->right,word);   
  42.        node->right=tmp;     
  43.     }else
  44.        node->count++;     
  45.     }     
  46.     return node; 
  47. /** 
  48. 从指定的流中读取单词  
  49. */ 
  50. int getWord(char* ch,size_t n,FILE* f) 
  51.    int c; 
  52.    char* p = ch; 
  53.    while(isspace(c=fgetc(f))) 
  54.          ; 
  55.   if(c!=EOF) 
  56.        *p++=c; 
  57.   if(!isalpha(c)) 
  58.   { 
  59.      *p='\0';             
  60.      return c; 
  61.   } 
  62.   for(;--n>0;p++) 
  63.   { 
  64.      if(!isalnum(*p=fgetc(f))) 
  65.      {               
  66.         ungetc(*p,f);                         
  67.         break
  68.      }             
  69.   } 
  70.    *p='\0'
  71.    return c;       
  72.                  
  73. //是否tree占用的内存   
  74. void treeFree(TreeNode* root) 
  75.    if(root!=NULL) 
  76.    { 
  77.       treeFree(root->left);             
  78.       free(root->word); //释放节点的word占用的内存   
  79.       free(root);       //是否节点占用的内存           
  80.       treeFree(root->right);             
  81.    }   
  82. //Test.c  
  83. #include <stdio.h>  
  84. #include <stdlib.h>  
  85. #include "TreeNode.h"  
  86.  
  87. #define MAX 100  
  88. int main(int argc, char *argv[]) 
  89.   FILE* f; 
  90.   char w[MAX]={0}; 
  91.   char* fname="TreeNode.h"
  92.   if((f=fopen(fname,"r"))!=NULL) 
  93.   { 
  94.     TreeNode* root = NULL; 
  95.     while((getWord(w,MAX,f)!=EOF)) 
  96.      { 
  97.           if(isalpha(w[0])) 
  98.               root = addNode(root,w);                         
  99.      } 
  100.     tprint(root);   
  101.     treeFree(root);                             
  102.     fclose(f);                                     
  103.   }else
  104.          printf("open %s error\n",fname);   
  105.  } 
  106.   getchar();     
  107.   return 0; 

相关内容