これは、バイナリ ツリーの問題というよりはポインタの問題だと思います。演習として、二分木を使用して C で推測/学習ゲームを再作成していました。ツリーを調べて質問するトラバースというメソッドがありました。このメソッドは、存在しないノードが見つかったときに、ユーザーにノードを作成するための入力を求めるため、学習部分です。ただし、これを行うと、データが破損します。これは、関連するコードを再作成したものです。
Node * getnew(char *msg, char isAns)
{
Node *nnew = malloc(sizeof(Node));
nnew->ID=clock();
nnew->guess=msg;
nnew->isAns=isAns;
nnew->yes=0;
nnew->no=0;
return nnew;
}
void traverse(Node **top)
{
char ques[128] = "ok";
char ans[128] = "ok";
printf("Node is null\n");
printf("Put in a question and answer to yes condition\n");
printf("Enter question: ");
while(!fgets(ques,128,stdin));
printf("Enter answer for yes condition: ");
while(!fgets(ans,128,stdin));
printf("Check ques: %s\nCheck ans: %s\n\n",ques,ans);
make_question_answer(top,ques,ans);
fprintf(stdout,"\ncheck in method: top: %s\n\n",(*top)->guess);
fprintf(stdout,"\ncheck in method: top->yes: %s\n\n",(*top)->yes->guess);
}
void make_question_answer(Node **change, char *ques,char *ans)
{
Node *top = getnew(ques,'n');
Node *a = getnew(ans,'y');
top->yes=a;
top->no=(*change);
*change=top;
}
int main()
{
Node *top=0;
traverse(&top);
fprintf(stdout,"\ncheck: %s\n\n",top->yes->guess);
}
メインで make_question_answer() を使用すると、トップが正常に変更され、トラバースで機能しますが、メインに戻るジャンプでは持続しません。fprintfで見られるように、破損したデータを指しています。なぜこれが起こっているのか分かりません。