![]() |
|
![]() |
Word.c ver.006 のソースです。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define WORDMAX 64
typedef struct tnode{
char word[WORDMAX];
/* 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.06の変更点*/
/**********************************************************************
=GetWord()=
改行文字までの文字列str、単語格納回数i、単語格納配列wordを引数に持ち、
文字列中の全ての単語をwordに格納して、単語格納回数を返す関数
#include <ctype.h>が必要
str…メイン関数で読み込んだ一文
i……単語格納配列wordの要素番号
word…単語格納配列。
**********************************************************************/
int GetWord(const char* str, int i, char **word){
char c;
int l, j=0, state=0;
for (l=0; (c=str[l])!='\n' && (c=str[l])!=EOF ;l++){
tolower(c); /*大文字→小文字*/
if (!isalpha(c) && c=='\''){ /*cが英文字の時*/
word[i][j]=c;
j++;
}
else{
word[i][j]='\0';
i++;
j=0;
}
}
return i;
}
int main(void){
FILE *fp;
int i=0, len;
char str[WORDMAX], word[512][WORDMAX];
char *c;
Node root={"\0",0, NULL, NULL};
/* ファイル操作 */
fp=fopen("file1.txt", "r");
while ((c=fgets(str,512,fp))!=NULL);
i=getword(str, i, word);
len=i;
for (i=0; *word[i]<=len ; i++)
root=addNode(&root, *word[i]);
TraverseNode(&root);/*ルートの位置からトラバーサルしながら出力する*/
fclose(fp);
}
|
メイン / コミュニティ / アベニュー / E-List / 街角広場
インフォメーションセンター / 検索 / ヘルプ / ガイドライン