#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("%s %4d\n", p->word, p->count);
TraverseNode(p->right);
}
}
/*以下ver0.07での変更点です。
とりあえず関数分割はしないで、以前作成したgetword関数の内容を
メイン関数に組み込んでみました。*/
int main(void){
char *ptr[MAXWORD]; /*最大単語数*/
char temp[MAXCHAR];
Node root={"\0",0, NULL, NULL};
Node *node;
node=&root;
FILE *fp;
int i=0,j=0;
char c;
fp=fopen("file1.txt","r");
if (fp==NULL){
printf("ファイルオープンに失敗しました。\n");
return -1;
}
while ((c=fgetc(fp))!=EOF || j<=MAXWORD){
if (!isalpha(c)){ /*読み込んだ文字が英字でなかった場合の処理*/
ptr[j]=(char *)malloc(sizeof(char)*i); /*単語を格納するための場所確保*/
strcpy((char *)*ptr[j], temp); /*確保した場所に単語を格納*/
node=addNode(node, (char *)ptr[j]); /*単語をaddNode関数に渡す*/
j++;
i=0;
}
else{
temp[i]=c;
i++;
}
}
fclose(fp);
TraverseNode(&root);
}
|