二叉树:关于生成二叉树的函数的问题

Ivar
  • 65

代码1:

typedef struct Node{
    char data;
    struct Node * LChild;
    struct Node * RChild;
}BiTNode,*BiTree;
//
void CreateBiTree(BiTree * bt){
    char ch;
    ch=getchar();
    if(ch=='.'){
        *bt=NULL;
    }
    else{
        *bt=(BiTree)malloc(sizeof(BiTNode));
        (*bt)->data=ch;
        CreateBiTree(&(*bt)->LChild);
        CreateBiTree(&(*bt)->RChild);
    }
}

void main(){
        BiTree b;
        CreateBiTree(BiTree &b)
}

代码2:

typedef struct Node{
    char data;
    struct Node * LChild;
    struct Node * RChild;
}BiTNode,*BiTree;
//
void CreateBiTree(BiTree  bt){
    char ch;
    ch=getchar();
    if(ch=='.'){
        bt=NULL;
    }
    else{
        bt=(BiTree)malloc(sizeof(BiTNode));
        bt->data=ch;
        CreateBiTree(bt->LChild);
        CreateBiTree(bt->RChild);
    }
}

void main(){
    BiTree b;
    CreateBiTree(BiTree b)
}

问题:1.代码一是正确的操作,请问代码二错在哪了?(通过代码二创建的二叉树,若调用遍历函数会直接出错,调试时发现代码二创建的树的data,LChild,RChild内存中是未知数据)

2.&(*bt)是否等价于bt? 为什么?按我的理解&和*相遇应该可以抵消吧..

回复
阅读 2k
2 个回答

注意函数在传参的时候一律是复制的,指针传入的时候,复制的是指针变量,形参和实参的指针变量是两个不同的变量,只是指向同一块区域而已。CreateBiTree明显是在函数内申请内存,并赋值给形参,那么形参指针必然要升一级,否则在函数内申请的内存是由函数的形参指向的,实参并没有发生变化,而且导致内存泄漏。

昨天提的问题,今天重新看了以下,发现问题2的关键在于 成员访问符->的优先级高于&

宣传栏