Image
WELCOME TO MY HOMEPAGE
ぽてとのC言語練習中ページ
Image

Word.c ver.007 のソースです。

#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);
}

トップページへ戻る


GeoCities Japan

メイン / コミュニティ / アベニュー / E-List / 街角広場
インフォメーションセンター / 検索 / ヘルプ / ガイドライン