吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1174|回复: 3
收起左侧

[已解决] C free结点出错

 关闭 [复制链接]
ing 发表于 2020-5-29 16:32
本帖最后由 ing 于 2020-5-29 21:46 编辑

捕获6.PNG
为什么我释放结点(37)会导致程序异常退出?
直接运行,异常退出,没有输出
捕获.PNG
尝试free结点 37
捕获2.PNG
不知道为什么会跑到这里。。
捕获3.PNG
发现尝试free结点并没有成功
捕获4.PNG
在debug窗口有输出且是正确的
捕获5.PNG




#include<stdio.h>
#include<stdlib.h>

#define MaxSize 15
#define length 10
#define VType int

typedef enum {FALSE,OK}Status;

typedef struct BitNode
{
    VType data;
    struct BitNode *lchild, *rchild;
}*BiTree;

Status searchBST(BiTree t,BiTree f,VType key,BiTree *p)
{
    if (!t)
    {
        *p = f;
        return FALSE;
    }
    else if (key < t->data)
        return searchBST(t->lchild,t,key,p);
    else if (key > t->data)
        return searchBST(t->rchild,t,key,p);
    else
    {
        *p = t;
        return OK;
    }
}

Status insertBST(BiTree *t,VType key)
{
    BiTree p,s;
    s = (BiTree) malloc(sizeof(BiTree));
    if (!searchBST(*t,NULL,key,&p))
    {
        s->data = key;
        s->lchild = s->rchild = NULL;

        if (!p)
            *t = s;
        else if (key < p->data)
            p->lchild = s;
        else
            p->rchild = s;
        return OK;
    }
    return FALSE;
}

Status deleteBST(BiTree *t, VType key)
{
    /*
     * f 是被删除结点的位置
     * p 是 f 的前驱结点
     * s 是 p 的父节点
     */
    BiTree f, p, s;
    if (!searchBST(*t, NULL, key, &f))
        return FALSE;

    s = f;
    if (!f->rchild)
    {
        f = f->lchild;
        free(s);
    }
    else if (!f->lchild)
    {
        f = f->rchild;
        free(s);
    }
    else
    {
        /*
         * 被删除的结点左右子树都有,找到 f 的前驱结点,根左右,向左拐后一直右拐
         * 然后让前驱结点的值赋给被删除的结点
         * 让前驱结点的父结点的等于前驱节点的左孩子结点
         * 最后将前驱结点释放
         */
        p = f->lchild;
        while (p->rchild)
        {
            s = p;
            p = p->rchild;
        }
        f->data = p->data;
        if (s != f)
            s->rchild = p->lchild;
        else
            s->lchild = p->lchild;
        free(p);
    }
    return OK;
}

int main()
{
    BiTree t = NULL;
    int a[length] = {62,88,58,47,35,73,51,99,37,93};
    for (int i = 0; i < length; ++i) {
        insertBST(&t,a[i]);
    }
    int status = deleteBST(&t,47);
    printf("status:%d",status);
}

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

苏紫方璇 发表于 2020-5-29 21:34
我这里测试insertBST会报错,修改sizeof(BiTree)为sizeof(BitNode)就可以运行了

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
ing + 2 + 1 我很赞同!

查看全部评分

从入门到入狱 发表于 2020-5-29 16:57
问题应该出现在查找定位那个函数,你单步调试一下,就知道了
sam喵喵 发表于 2020-5-29 17:26
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-26 15:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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