【发布时间】:2017-09-22 17:34:38
【问题描述】:
正如标题所说,我正在尝试从具有 2 个案例的树中删除一个节点:
- 节点是没有连接到任何东西的叶子
- 节点连接到另一个节点
我能够为第二种情况(对我来说最困难)创建一个工作函数,但第一种情况(这似乎很容易)无论我尝试什么都会导致分段错误。
结构体的定义如下:
struct node {
int value;
struct node *sx;
struct node *dx;
};
typedef struct node *tree;
这是执行消除操作的模块:
void destroy_node(tree Y, int elem) {
if (Y->value < elem)
destroy_node(Y->dx, elem);
if (Y->value > elem)
destroy_node(Y->sx, elem);
else { //
if (Y->sx == NULL && Y->dx == NULL) {
free(Y); <-- seg fault
Y = NULL; <-- seg fault
}
if (Y->sx != NULL && Y->dx == NULL) {
Y->value = (Y->sx)->value;
free(Y->sx);
Y->sx = NULL;
}
if (Y->sx == NULL && Y->dx != NULL) {
Y->value = (Y->dx)->value;
free(Y->dx);
Y->dx = NULL;
}
if (Y->sx != NULL && Y->dx != NULL)
printf("Can't eliminate that!\n");
}
print_everything(Y);
}
这里是main 电话:
tree Y = T;
printf("Which one you want to destroy? ");
scanf("%d", &elem);
destroy_node(Y, elem);
要编译我使用命令的函数
gcc -std=gnu99 -Wall -Wextra c.c
我的环境是虚拟机 ubuntu 17.04 with stock gcc
编辑 1
构建树的模块
tree insert_node(tree T, int val) {
if (T == NULL) {
T = (tree)malloc(sizeof(struct node));
T->value = val;
T->sx = NULL;
T->dx = NULL;
} else {
if ((T->value) < (val)) {
T->dx = insert_node(T->dx, val);
}
if ((T->value) > (val)) {
T->sx = insert_node(T->sx, val);
}
}
return T;
}
这里有这个模块main中的调用
printf("How many nodes your tree will have? ");
scanf("%d", &tot);
for (int i = 0; i < tot; i++) {
printf("What is the %d° node? ", (i + 1));
scanf("%d", &val);
T = insert_node(T, val);
}
附:如果程序的可理解性有问题,我会复制粘贴整个文件
【问题讨论】:
-
你能添加你构建树的部分吗?
-
@atru 插入了您要求的其他功能,希望对您有所帮助
-
您忘记检查
Y是否为空。 -
隐藏类型定义后面的指针?嗯。