您的位置:首页 > 编程语言 > C语言/C++

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

2012-10-23 11:12 573 查看
由于出现的单词不确定,所以用二叉树实现:

//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 语言 null struct tree file
相关文章推荐