二级指针的使用——二叉树的创建

二叉树的创建

typedef struct node
{
	char data;
	struct node *lchild, *rchild;
}Node,*pNode;
创建形式一:
int buildTree(pNode &T)
{
	char data;
	cin >> data;
	if (data == '#')
		T = NULL;
	else{
		T = (pNode)malloc(sizeof(Node));
		//生成根节点
		T->data = data;
		//生成左子树
		buildTree(T->lchild);
		//生成右子树
		buildTree(T->rchild);
	}
	return 0;
}
创建形式二:
void CreatBiTree( pNode * T)
{

    char ch;

    ch=getchar();
    if( ch == '*') //如果输入星号则二叉树的节点为空节点
        *T=NULL;
    else
    {
        if ( ! ( *T=(BiTree)malloc( sizeof(struct BiTNode) ) ) ) 
        {
             printf("内存分配失败!"); 
                return ; //如果输入的不是星号。则为新节点分配内存空间
        }
        else
        {
            (*T)->data=ch; 
            CreatBiTree(&((*T)->lchild)); //分配成功则接着建立左子树和右子树
         CreatBiTree(&((*T)->rchild)); 
        }
    } 
} 


 创建二叉树的时候传递的是二级指针,为何要传递二级指针呢?指针传值不是同时改变形参和实参吗? 

问题是,在建立二叉树的过程中,不是改变了形参的值,而是: 改变了形参的指向;而退出该函数后,形参被释放了,那么为形参动态分配的空间,也就没办法释放了,造成了内存泄露问题。

看下面转自hfm_honey学习乐园的例子

void get_Vale1(char *pt) 

{

       pt=(char *)malloc(strlen("sx_liang")+1);

        strcpy(pt,"sx_liang"); 

}

void get_Vale2(char **pt)


{

       *pt=(char *)malloc(strlen("sx_liang")+1);

        strcpy(*pt,"sx_liang"); 

}



int main()

{

         char *pt=NULL;

   

         get_Vale1(pt); //看看,这里调用的过程中,传递的是一级指针;

           if( NULL==pt) //额。。。。在这里呢,就会执行if 里边的信息了。。。

          {

                       cout<<"pt is NULL"<<endl;

                       exit(1);

          }

           else

                cout<<pt<<endl;

                get_Vale2(&pt); //这里呢,传递的是二级指针,结果呢,就输出了“sx_liang";

         if( NULL==pt) 

          {

                       cout<<"pt is NULL
           }
}
什么原因呢: 咱开始分析一下:
void get_Vale1(char *M)//这里呢,传递了一个指针,此时,M和 实参 pt 的指向内存的同一块空间,都指向了null;
M=(char *)malloc(strlen("sx_liang")+1); //此时呢,给M的重新开辟了一块空间, 而实参pt 没有变化,还指向NULL;
//就是这里,M 和pt 已经没有联系了,彻底变成了两个指向不同的指针;
strcpy(M,"sx_liang");//退出函数时,因为M是局部变量,在栈中分配的空间,那么M自动销毁,而在堆中为M分配的空间呢,泄露了,没有被释放;是个问题!
void get_Vale2(char **M)//这里呢,传递的是二级指针;此时,M 指向实参,而不是和实参一样指向null;*M 此时才和pt相同,都指向了NULL;注意体会一下;
*M=(char *)malloc(strlen("sx_liang")+1);//在这里呢,*M就是 实参pt ,给*M申请空间,就是在为pt 申请空间;注意体会了;
strcpy(*M,"sx_liang");//推出函数后,M销毁,但是它申请的空间没被释放,但是该空间有pt 指向它,不担心释放问题








  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值