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

来源:互联网 发布:java如何导入jar包 编辑:程序博客网 时间:2024/06/05 14:27

今天在写二叉树的建立时,遇见了指针作为参数的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));      }     } 



0 0