我认为这更像是一个指针问题而不是二叉树问题。作为练习,我使用二叉树在 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);
}
在 main 中使用 make_question_answer() 将成功更改顶部,并且它可以在 traverse 中工作,但在跳转回 main 时不会持续。它指向使用 fprintf 看到的损坏数据。我不知道为什么会这样。