/*********************************************************
二分木を使った単語出現回数カウントプログラム
Word.c ver0.08 改訂版 (2001/12/22 16:00)
**********************************************************/
/*****以下ver0.08改訂版で変更した個所の一覧です。************
○メイン関数内でint型変数jを削除しました。
○単語解析の順番を変更しました。
○少しコメントを変えました。
**********************************************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAXCHAR 64
#define MAXWORD 256
typedef struct tnode{
char word[MAXCHAR];
/* int count=0; */
int count;
struct tnode *left;
struct tnode *right;
}Node;
Node* makeNode(const char *str){
/* ノード作成 */
Node *root;
root=(Node *)malloc(sizeof(Node));
strcpy(root->word, str);
root->count=1;
root->left=root->right=NULL;
return root;
}
Node* addNode(Node* p, const char *str){
/* ノード追加処理 */
if (p==NULL){ /*今いるところが空欄なら新ノードを作成*/
p=makeNode(str);
}
else if (!strcmp(str, p->word))
p->count++;
else if (strcmp(str, p->word)<0)
p->left=addNode(p->left, str);
else
p->right=addNode(p->right, str);
return p;
}
void TraverseNode(const Node *p){
/* 解析と出力*/
if (p!=NULL){
TraverseNode(p->left);
printf("%15s %4d\n", p->word, p->count);
TraverseNode(p->right);
}
}
int main(void){
char temp[MAXCHAR];
FILE *fp;
unsigned int i=0;
char c;
Node *node=NULL;
fp=fopen("file1.txt","r");
if (fp==NULL){
printf("ファイルオープンに失敗しました。\n");
return -1;
}
while (!feof(fp)){
c=fgetc(fp);
if (isalpha(c)) { /*英文字が来た時*/
temp[i]=c;
i++;
}
else if (!isalpha(c) && i>0){ /*単語を1つ読み終えたとき*/
temp[i]='\0';
node=addNode(node, temp); /*単語をノードとして二分木を形成*/
i=0;
}
else{/*英字以外の文字が続いた時*/
;
}
}
fclose(fp);
TraverseNode(node);
return 0;
}
|