二分木について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
油田
記事: 1
登録日時: 8年前

二分木について

#1

投稿記事 by 油田 » 8年前

二分木のプログラムについて途中まで作ったのですがここから先がうまくいかないので質問させてください。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct node{
char sentence[100];
struct node *yes;
struct node *no;
};

void error(char *s);
struct node *make_node();
void questionTree(struct node *node);

int main(void){
struct node *node;
struct node *node_head;
char a[]="鼻が長い";
char b[]="ゾウ";
char c[]="ウマ";
char d='\n';
char dummy;
node=make_node();
node->yes=make_node();
node->no=make_node();
node_head=node;
strcpy(node->sentence,a);
strcpy(node->yes->sentence,b);
strcpy(node->no->sentence,c);
while(d!='n'){
questionTree(node);
printf("もう一度やりますか?");
scanf("%c",&d);
scanf("%c",&dummy);
}
return(0);

}


struct node *make_node(){
struct node *p;

if((p=(struct node*)malloc(sizeof(struct node)))==NULL)
error("メモリが足りません");
memset(p->sentence,'\0', 100);
p->yes =NULL;
p->no =NULL;
return(p);
}

void questionTree(struct node *node){
char m;
char b;
char dummy;
char c[100];
printf("それは%sですか?\n",node->sentence);
scanf("%c",&m);
scanf("%c",&dummy);
if(m=='y'){
if(node->yes!=NULL)
questionTree(node->yes);
else{
printf("\n");
}
}
else{
if(node->no!=NULL)
questionTree(node->no);
else{
printf("その動物の特徴はなんですか?\n");
scanf("%s",&c);
node->no=make_node();
node=node->no;
strcpy(node->sentence,c);
printf("その動物は何ですか?\n");
scanf("%s",&c);
node->yes=make_node();
node=node->yes;
strcpy(node->sentence,c);

}
}
}

void error(char *s){
fprintf(stderr, s);
exit(1);
}


一度新しい動物を入力する方向に分岐すると、そこから先なにを入力しても新しい動物を入力する方向にしか進めなくなってしまいます。どうしたら改善できるでしょうか?よろしくおねがいします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 二分木について

#2

投稿記事 by みけCAT » 8年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
油田 さんが書きました:一度新しい動物を入力する方向に分岐すると、そこから先なにを入力しても新しい動物を入力する方向にしか進めなくなってしまいます。どうしたら改善できるでしょうか?よろしくおねがいします
動物の名前を読み込んだ後改行などの区切り文字(以下、改行文字)を読み込んでいないので、y/nを読み込むはずの場所に改行文字が読み込まれてしまい、選択が効かなくなっているようです。
従って、動物の名前を読み込んだ直後に改行文字を読み込むようにするといいと思います。

また、char c[100];に対しscanf("%s",&c);を使うのは、%sはchar*を要求するのに、char(*)[100]型のデータが渡されてしまい、未定義動作になります。
バッファオーバーラン対策も含めたscanf("%99s",c);とすると改善するでしょう。
戻り値を見て読み込めたかをチェックすると、さらにいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 二分木について

#3

投稿記事 by かずま » 8年前

scanf("%c",&d);
scanf("%c",&dummy);
をひとつの scanf(" %c",&d); に変えましょう。
% の前はスペースです。
このスペースが改行コードを読み飛ばしてくれます。
dummy に入るはずだった次の改行コードは、
次の scanf("%s" で読み飛ばされます。

scanf("%c",&m);
scanf("%c",&dummy);
も同様。

返信

“C言語何でも質問掲示板” へ戻る