一个二叉树的建立,不知道哪里错了呢

 void create(BiTree *T) {
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        *T = NULL;
    else {
        *T = (BiTree)malloc(sizeof(BiNode));
        if(*T) {
            (*T)->data = ch;
            create(&(*T)->lchild);
            create(&(*T)->rchild);
        }
        else return ;
    }
}

上面是正确的代码
为什么不能用下面的这片???

void create(BiTree T) {
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        T = NULL;
    else {
        T = (BiTree)malloc(sizeof(BiNode));
        if(T) {
            T->data = ch;
            create(T->lchild);
            create(T->rchild);
        }
        else return ;
    }
} 

之前的void create(BiTree T)这里,T是形式参数传进去的,在create的子函数里进行的操作,是对形式参数的操作,子函数结束时就都释放了,不会返回到主函数
void create(BiTree *T)这里,用到了指针指向T的地址,相当于对T的地址的操作,是一直有效的
也可以写成(BiTree *&T)下面都用T
这里涉及C语言指针的相关知识

这是一个值传递,如果不用地址传递,函数对变量的操作是不会作用于原来的变量中的。只有函数里的二叉树被建立。可以改变函数的返回类型。

如果你要修改传入函数的参数的值,就必须把它的地址传过去。

把create(T->lchild);
create(T->lchild);
改成T->lchild=create(T->lchild);
T->rchild=create(T->rchild);试试看

这样做的话函数就要有返回值了

你这就是搞不懂指针怎么传入,链式结构所有都是传送指针,别直接传个结构体进去,非常容易出错的,因为链式结构内部用的是指针,你拿本身去给结构体内部的指针进行赋值的时候要用取址符号的,直接递归是错的。malloc也用错了

链式结构一定要避免直接使用结构,使用指针是最好的选择,而且如果参加比赛的时候,一旦你选择在链式结构中这么使用,立即就是0分

主调函数要改变被调函数里的值,必须传递地址