回 帖 发 新 帖 刷新版面

主题:(求助)关于用C语言实现二叉树的二叉链表的创建

用递归算法,先顺。

struct BinTree{

        char            data;
        struct BinTree  *lchild;
        struct BinTree  *rchild;
};
void    PreCreateBinTree(struct BinTree **root)
{
        char    ch;
        scanf(" %c",&ch);
        if (ch=='?')
        {
                *root = NULL;
                printf("\nNULLKEY,function returned!\n");
                return ;
        }
        else{
                *root = (struct BinTree*)malloc(sizeof(struct BinTree));
                (*root)->data = ch;
                PreCreateBinTree(&((*root)->lchild));
                PreCreateBinTree(&((*root)->rchild));
        }
}
把指向root指针的指针,传给PreCreateBinTree()函数,
假如有
struct BinTree *root = NULL;
当执行PreCreateBinTree(&root);后按理说root里因该有内容了,
但是,当输入ab??c??时,root指向的却是最后一个c而不是a.
请问,怎样才能使root指向a.

回复列表 (共4个回复)

沙发

应该不会啊,root应该一直指向a的,我觉得

板凳

void main()
{
    struct BinTree *root;
    PreCreateBinTree(&root);
    printf("%c\n",root->data);
}


输出:
ab??c??

NULLKEY,function returned!

NULLKEY,function returned!

NULLKEY,function returned!

NULLKEY,function returned!
a
Press any key to continue

3 楼

给你改了一下,整个过程更清晰:

#include <stdio.h>
#include <malloc.h>
struct BinTree{

        char            data;
        struct BinTree  *lchild;
        struct BinTree  *rchild;
};
void    PreCreateBinTree(struct BinTree **root)
{
        char    ch;
        scanf(" %c",&ch);
        if (ch=='?')
        {
                *root = NULL;
                printf("NULL结点,返回\n");
                return ;
        }
        else{
        printf("新结点:%c\n",ch);
                *root = (struct BinTree*)malloc(sizeof(struct BinTree));
                (*root)->data = ch;
        printf("正在创建%c的左子树\n",(*root)->data);
                PreCreateBinTree(&((*root)->lchild));
        printf("正在创建%c的右子树\n",(*root)->data);
                PreCreateBinTree(&((*root)->rchild));
        }
}
void main()
{
    struct BinTree *root;
    PreCreateBinTree(&root);
    printf("root->data=%c\n",root->data);
}


ab??c??
新结点:a
正在创建a的左子树
新结点:b
正在创建b的左子树
NULL结点,返回
正在创建b的右子树
NULL结点,返回
正在创建a的右子树
新结点:c
正在创建c的左子树
NULL结点,返回
正在创建c的右子树
NULL结点,返回
root->data=a
Press any key to continue

4 楼

[quote]给你改了一下,整个过程更清晰:

#include&nbsp;<stdio.h>
#include&nbsp;<malloc.h>
struct&nbsp;BinTree{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;BinTree&nbsp;&nbsp;*lchild;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;BinTree&nbsp;&nbsp;*rchild;
};
void&nbsp;&nbsp;&nbsp;&nbsp;PreCreateBinTree(struct&nbsp;BinTree&nbsp;**root)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;ch;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("&nbsp;%c",&ch);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ch=='?')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*root&nbsp;=&nbsp;[color=FF0000]NULL[/color];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("NULL结点,返回\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("新结点:%c\n",ch);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*root&nbsp;=&nbsp;(struct&nbsp;BinTree*)malloc(sizeof(struct&nbsp;BinTree));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*root)->data&nbsp;=&nbsp;ch;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("正在创建%c的左子树\n",(*root)->data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreCreateBinTree(&((*root)->lchild));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("正在创建%c的右子树\n",(*root)->data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreCreateBinTree(&((*root)->rchild));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
}
void&nbsp;main()
{
&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;BinTree&nbsp;*root;
&nbsp;&nbsp;&nbsp;&nbsp;PreCreateBinTree(&root);
&nbsp;&nbsp;&nbsp;&nbsp;printf("root->data=%c\n",root->data);
}
上面的NUll好像没有定义,为什么编译也不抱错呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册