C free结点出错
本帖最后由 ing 于 2020-5-29 21:46 编辑为什么我释放结点(37)会导致程序异常退出?
直接运行,异常退出,没有输出
尝试free结点 37
不知道为什么会跑到这里。。
发现尝试free结点并没有成功
在debug窗口有输出且是正确的
```
#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 = {62,88,58,47,35,73,51,99,37,93};
for (int i = 0; i < length; ++i) {
insertBST(&t,a);
}
int status = deleteBST(&t,47);
printf("status:%d",status);
}
``` 我这里测试insertBST会报错,修改sizeof(BiTree)为sizeof(BitNode)就可以运行了 问题应该出现在查找定位那个函数,你单步调试一下,就知道了 代码有点乱
页:
[1]