0

我认为这更像是一个指针问题而不是二叉树问题。作为练习,我使用二叉树在 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 看到的损坏数据。我不知道为什么会这样。

4

2 回答 2

2

我认为实际发生的是您正在存储指向本地字符数组的指针,而不是复制字符串。在您的getnew函数中,像这样复制字符串:

nnew->guess = strdup(msg);
于 2013-05-02T22:25:36.110 回答
1

在 getnew() 中,您将 nnew->guess 分配给堆栈变量。考虑为字符串分配内存并使用 strncpy() 或其他机制来填充新分配的内存。

于 2013-05-02T22:24:38.853 回答