freedom_wings4 2016-05-26 02:26 采纳率: 0%
浏览 1267
已采纳

c语言,形参是指针的引用,和形参是指针,两者结果不同,求指点

自定义的头文件

 typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild;

}BiTNode, *BiTree;

如下是使用形参是指针的引用的函数,结果是正确的

 #include "BiTree.h"
#include "stdlib.h"
#include "stdio.h"


bool Delete(BiTree &p)
{
    BiTree q = (BiTree)malloc(sizeof(BiTNode));
    q = p;
    p = p->lchild;
    free(q);
    return true;
}



bool DeleteBST(BiTree &T, int key)
{
    if (!T)return false;
    else if (key==T->data)
    {
        return Delete(T);
    }
    else if (key < T->data)
    {
        return DeleteBST(T->lchild, key);
    }
}

int main()
{
    BiTree t1 = (BiTree)malloc(sizeof(BiTNode));
    BiTree t2 = (BiTree)malloc(sizeof(BiTNode));
    BiTree t3 = (BiTree)malloc(sizeof(BiTNode));
    t1->data = 3;
    t2->data = 2;
    t3->data = 1;
    t1->lchild = t2;
    t1->rchild = NULL;
    t2->lchild = t3;
    t2->rchild = NULL;
    DeleteBST(t1, 2);

    printf("%d\n", t1->lchild->data);

    system("PAUSE");


    return 0;

}

结果
图片说明

然后如下是形参为指针的,其实函数是一样的,只是形参从上面的接收指针的引用改为了接收指针

 #include "BiTree.h"
#include "stdlib.h"
#include "stdio.h"


bool Delete(BiTree p)
{
    BiTree q = (BiTree)malloc(sizeof(BiTNode));
    q = p;
    p = p->lchild;
    free(q);
    return true;
}



bool DeleteBST(BiTree T, int key)
{
    if (!T)return false;
    else if (key==T->data)
    {
        return Delete(T);
    }
    else if (key < T->data)
    {
        return DeleteBST(T->lchild, key);
    }
}

int main()
{
    BiTree t1 = (BiTree)malloc(sizeof(BiTNode));
    BiTree t2 = (BiTree)malloc(sizeof(BiTNode));
    BiTree t3 = (BiTree)malloc(sizeof(BiTNode));
    t1->data = 3;
    t2->data = 2;
    t3->data = 1;
    t1->lchild = t2;
    t1->rchild = NULL;
    t2->lchild = t3;
    t2->rchild = NULL;
    DeleteBST(t1, 2);

    printf("%d\n", t1->lchild->data);

    system("PAUSE");


    return 0;

}

结果
图片说明
结果明显是有问题的,原因应该在free了第2个结点,却没把第一个结点的lchild改为指向第3个结点。可是为什么前一个(即接收指针的引用那个)却没问题呢?两个的区别仅仅在于接收的参数,可是前一个没问题而后一个出了问题。我想不明白前一个为什么会没出问题,求大神指点

  • 写回答

1条回答

  • 小灸舞 2016-05-26 04:47
    关注

    传不传引用,关键在于p = p->lchild;这句的效果
    对于释放结点free都是可以正确释放掉的,你输出的-17891602是释放后的t2的data值
    如果不传引用,p=p->lchild是不会影响到调用它的实参的,操作的只是一个拷贝

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名