吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 940|回复: 2
收起左侧

[求助] 通过传递指针代替函数返回值

[复制链接]
ing 发表于 2020-2-5 23:11
本帖最后由 ing 于 2020-2-6 12:09 编辑


通过不断的递归,最后参数 BiTree *r 只剩一个结点
捕获.PNG


为什么最后指针的值(指针 r 并不只有一个结点)并没有被修改?我通过不断的递归修改的指针值没有被保留
捕获2.PNG

这将导致依次插入3,4,2,5,9输出的是2 3 9;因为 r 指针位置没有成功移动到 data:4 的结点位置。



#include<malloc.h>
#include<stdio.h>
#include <stdbool.h>

#define KeyType int
#define ElemType int

typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *l_child, *r_child;
}BiTNode,*BiTree;

//r 是 p 结点的父结点
bool searchBST(BiTree p,KeyType key,BiTree *r)
{
    if (!p)
    {
//在该方法结束后,回到 insertBST 时 p、r 的值并没有像预期那样,与这的 p、r 相同
        p = *r;
        return false;
    }
    else if (key == p->data)
    {
        return true;
    }
    else if (key < p->data)
    {
        searchBST(p->l_child,key,&p);
    }
    else
    {
        searchBST(p->r_child,key,&p);
    }
}

bool insertBST(BiTree *t,ElemType e)
{
//指针指向了 t,因此 r 增加结点 t 也会增加
    BiTree *r = t;
    BiTree p = *r;
//搜索方法调用后,指针p、r 均未改变??
    if (!searchBST(p,e,r))
    {
        BiTNode *s = (BiTNode*)malloc(sizeof(BiTNode));
        s->data = e;
        s->r_child = s->l_child = NULL;

        if (!(*t))
            *r = s;
        else if ((*t)->data > e)
        {
            (*r)->l_child = s;
        }
        else
            (*r)->r_child = s;
        return true;
    }
    return false;
}

bool delete(BiTree *t)
{
    BiTree q,s;
    if (!(*t)->l_child && !(*t)->r_child)
        (*t) = NULL;
    else if (!(*t)->l_child)
    {
        q = *t;
        *t = (*t)->r_child;
        free(q);
    }
    else if (!(*t)->r_child)
    {
        q = *t;
        *t = (*t)->l_child;
        free(q);
    }
    else
    {
        q = *t;
        s = (*t)->l_child;
        while (!(*t)->r_child)
        {
            q = s;
            s = s->r_child;
        }
        (*t)->data = s->data;
        //判断结点 p 的左子树 s 是否有右子树,分为两种情况讨论
        if(q != *t)
        {
            q->r_child = s->l_child;//若有,则在删除直接前驱结点的同时,令前驱的左孩子结点改为 q 指向结点的孩子结点
        }
        else
        {
            q->l_child = s->l_child;//否则,直接将左子树上移即可
        }

        free(s);
    }
    return true;
}

bool deleteBST(BiTree *t,ElemType e)
{
    if (e == (*t)->data)
    {
        delete(t);
        return true;
    }
    else if (e < (*t)->data)
        deleteBST(&(*t)->l_child,e);
    else if (e > (*t)->data)
        deleteBST(&(*t)->r_child,e);
    return false;
}

//中序输出
void order(BiTree t)
{
    if (!t)
        return;
    order(t->l_child);
    printf("%d ",t->data);
    order(t->r_child);
}

int main(int argc, char* argv[])
{
    BiTree t = NULL;
    int a[5] = {3,4,2,5,9};
    for (int i = 0; i < 5; ++i) {
        insertBST(&t,a[i]);
    }
    printf("中序遍历二叉排序树:\n");
    order(t);
    printf("\n删除3后,中序遍历二叉排序树:\n");
    deleteBST(&t,3);
    order(t);

    return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

huayugongju 发表于 2020-2-5 23:44
问题出在这个地方:bool searchBST(BiTree p,KeyType key,BiTree *r)  
第一个入参 p 是临时变量,没有办法做出参(将修改后的值带出),这里推荐使用二重指针才解决修改指针地址。

修改为:bool searchBST(BiTree **p,KeyType key,BiTree *r)  
调用:searchBST(&p->l_child,key,&p);
赋值:*p = r

免费评分

参与人数 1吾爱币 +1 收起 理由
ing + 1 这样做也并不太行!

查看全部评分

huayugongju 发表于 2020-2-6 15:13
huayugongju 发表于 2020-2-5 23:44
问题出在这个地方:bool searchBST(BiTree p,KeyType key,BiTree *r)  
第一个入参 p 是临时变量,没有办 ...

你调试看看,这个就是问题的本质“”通过二级指针才能修改指针的值,做出参“”
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-13 17:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表