用二级指针作为形参建立二叉树

今天在写二叉树的建立时,遇见了指针作为参数的bug。经过查找,进一步的理解了二级指针。

二级指针,也就是指针的指针,作用主要是为了改变指针本身的数据,在这里,可以把指针本身看成一个变量,既然是变量,那就肯定可以修改其内容,所以可以借助一个二级指针来改变指针本身的数据。

用指针作为形参,类似二叉树先序遍递归历的方法,建立二叉树。写了如下代码。

typedef struct node 
{ 
    char data; 
    struct node *lchild,*rchild; 
}BiNode,*BiTree; 
void CreatBiTree(BiTree T) 
{ 
    char a; 
    
    scanf("%c",&a); 
    if(a=='@') 
     T=NULL; 
    else 
     { 
       T=(BiTree)malloc(sizeof(BiNode)); 
       T->data=a; 
       CreatBiTree(T->lchild); 
       CreatBiTree(T->rchild); 
     } 
     
} 
运行没有错误,可以结果不对。后发现是形参出错了。

递归函数传递一级指针T,并在函数中重新malloc()是有问题的!

在递归过程中,函数的形参一级指针 T 压入栈中,函数执行时一级指针 T 却被malloc()改变,当函数返回时,形参的指针与函数中的指针不同,不能形参逻辑上的联系,则二叉树不能建立。

相当于如下问题

int main()
{
    int a =2;
    foo1(a);
}
void foo1( int a)
{
	a = 4;
}
a 作为foo(a)的形参 a = 2,在foo(a)内发生改变 a = 4,但在返回main()时,仍 a = 2; 

解决的方法是 使用二级指针作为形参(传递的是一级指针的地址)。如下代码。这样malloc() 就可以改变一级指针 *T的值,但递归函数之间是通过 一级指针(*T)的地址(&*T)联系的。一级指针的地址是不会发生变化的,所以实现了即改变一级指针的内容,又实现了函数的递归。

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



你可能感兴趣的:(数据结构,C语言)