質問編集履歴

1 修正結果の追記

Breaststroke

Breaststroke score 6

2017/05/09 10:33  投稿

C言語の構造体で2分木を作るプログラムの実行時エラーの解決策を教えてください。
初心者なので不備が多いかと思いますが、とりあえず動くようにしたいです。
自分でいろいろいじってみましたがどうしてもわかりません。
どこをどう直せばいいのかどなたかご教授お願い致します。
###概要
英文が書かれたテキストファイルから単語(スペースで区切られた塊)
を切り出して2分木にソートして順番に表示するプログラム
###問題点
コンパイルは通るが、実行時に「動作を停止しました。」と出る。
デバッグすると、printTree()内のprintf()でアクセス違反が生じている。
###環境
windows10
Visual Studio 2013
###コード
###追記
お二方回答ありがとうございます。
fscanfで読み込んで、新しく型のエラーが生じたところを修正したところ、
一応例外は吐かなくなりました。残りは何とか考えますmm
###修正前コード
```C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char DATA;
struct node {
   DATA d;
   int count;
   struct node *left; // 左部分木
   struct node *right; // 右部分木
};
typedef struct node NODE;
typedef NODE *BTREE;
BTREE insertNode(BTREE, DATA*);
BTREE allocNode(DATA);
void printBtree(BTREE);
void freeBtree(BTREE);
int main(void){
   FILE *fp;
   BTREE root = NULL;
   DATA str[50];
   fp = fopen("./a.txt", "r");
   if (fp == NULL){
       printf("\aファイルをオープンできません。\n");
   }
   else {
       while (fgetc(fp) != EOF){
           root = insertNode(root, str);
       }
       printBtree(root);
       freeBtree(root);
       fclose(fp);
   }
   return 0;
}
BTREE insertNode(BTREE node, DATA *x) {
   BTREE p = node;
   DATA dat = *x;
   if (p == NULL) { // rootに挿入
       p = allocNode(dat);
       return p;
   }
   if (dat == p->d)
   {
       p->count++;
   }
   else if (dat < p->d)
   {
       // 左部分木に割り当て
       p->left = insertNode(p->left, &dat);
       // 再帰呼出し
   }
   else {
       // 右部分木に割り当て
       p->right = insertNode(p->right, &dat);
       // 再帰呼出し
   }
   return p;
}
BTREE allocNode(DATA x) {
   BTREE p;
   p = (BTREE)malloc(sizeof(NODE));
   p->d = x;
   p->left = p->right = NULL;
   return p;
}
void printBtree(BTREE p) {
   if (p != NULL) {
       printBtree(p->left);       // 左部分木の処理(再帰呼び出し)
       printf("WORD : %s COUNT : %d\n", p->d, p->count);
       printBtree( p->right );    // 右部分木の処理(再帰呼び出し)
   }
   else printf("p==NULL\n");
   return;
}
void freeBtree(BTREE p) {
   if (p != NULL) {
       freeBtree(p->left);       // 左部分木の処理(再帰呼び出し)
       freeBtree( p->right );    // 右部分木の処理(再帰呼び出し)
       free( p );
   }
   return;
}
```
```
  • C

    5775 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る