freedom_wings4
freedom_wings4
采纳率19.8%
2016-05-26 02:26 阅读 1.3k
已采纳

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条回答 默认 最新

  • 已采纳
    qq423399099 小灸舞 2016-05-26 04:47

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

    点赞 1 评论 复制链接分享

相关推荐