初心者なので不備が多いかと思いますが、とりあえず動くようにしたいです。
自分でいろいろいじってみましたがどうしてもわかりません。
どこをどう直せばいいのかどなたかご教授お願い致します。
###概要
英文が書かれたテキストファイルから単語(スペースで区切られた塊)
を切り出して2分木にソートして順番に表示するプログラム
###問題点
コンパイルは通るが、実行時に「動作を停止しました。」と出る。
デバッグすると、printTree()内のprintf()でアクセス違反が生じている。
###環境
windows10
Visual Studio 2013
###追記
お二方回答ありがとうございます。
fscanfで読み込んで、新しく型のエラーが生じたところを修正したところ、
一応例外は吐かなくなりました。残りは何とか考えますmm
###修正前コード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5typedef char DATA; 6struct node { 7 DATA d; 8 int count; 9 struct node *left; // 左部分木 10 struct node *right; // 右部分木 11}; 12typedef struct node NODE; 13typedef NODE *BTREE; 14BTREE insertNode(BTREE, DATA*); 15BTREE allocNode(DATA); 16void printBtree(BTREE); 17void freeBtree(BTREE); 18 19int main(void){ 20 FILE *fp; 21 BTREE root = NULL; 22 DATA str[50]; 23 fp = fopen("./a.txt", "r"); 24 if (fp == NULL){ 25 printf("\aファイルをオープンできません。\n"); 26 } 27 else { 28 while (fgetc(fp) != EOF){ 29 root = insertNode(root, str); 30 } 31 printBtree(root); 32 freeBtree(root); 33 fclose(fp); 34 } 35 return 0; 36} 37 38BTREE insertNode(BTREE node, DATA *x) { 39 BTREE p = node; 40 DATA dat = *x; 41 if (p == NULL) { // rootに挿入 42 p = allocNode(dat); 43 return p; 44 } 45 if (dat == p->d) 46 { 47 p->count++; 48 } 49 else if (dat < p->d) 50 { 51 // 左部分木に割り当て 52 p->left = insertNode(p->left, &dat); 53 // 再帰呼出し 54 } 55 else { 56 // 右部分木に割り当て 57 p->right = insertNode(p->right, &dat); 58 // 再帰呼出し 59 } 60 return p; 61} 62 63BTREE allocNode(DATA x) { 64 BTREE p; 65 p = (BTREE)malloc(sizeof(NODE)); 66 p->d = x; 67 p->left = p->right = NULL; 68 return p; 69} 70 71void printBtree(BTREE p) { 72 if (p != NULL) { 73 printBtree(p->left); // 左部分木の処理(再帰呼び出し) 74 printf("WORD : %s COUNT : %d\n", p->d, p->count); 75 printBtree( p->right ); // 右部分木の処理(再帰呼び出し) 76 } 77 else printf("p==NULL\n"); 78 return; 79} 80 81void freeBtree(BTREE p) { 82 if (p != NULL) { 83 freeBtree(p->left); // 左部分木の処理(再帰呼び出し) 84 freeBtree( p->right ); // 右部分木の処理(再帰呼び出し) 85 free( p ); 86 } 87 return; 88}

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/09 01:24