正如标题所说我试图从有两种情况的树中删除一个节点:
我能够为第二种情况(对我来说最困难)制作一个工作函数,但第一种情况(看起来很容易)会导致分段错误,无论我尝试什么。
这是struct的定义:
public synchronized V get(Object key) {
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return (V)e.value;
}
}
return null;
}
以下是执行消除操作的模块:
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);
我的环境是一个虚拟机ubuntu 17.04 with stock gcc
编辑1
构建树的模块
gcc -std=gnu99 -Wall -Wextra c.c
此模块主要有一个电话
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;
}
P.S。如果关于程序的可理解性存在问题,我将复制粘贴整个文件
答案 0 :(得分:0)
您的功能中缺少部分:
Y != NULL
。你会在空树上有未定义的行为。if
语句后缺少其他内容。您错误地删除了Y->value <= elem
。您应该更改API以返回指针参数的更新值:
tree destroy_node(tree Y, int elem) {
tree res = Y;
if (Y != NULL) {
if (Y->value < elem) {
Y->dx = destroy_node(Y->dx, elem);
} else
if (Y->value > elem) {
Y->sx = destroy_node(Y->sx, elem);
} else {
if (Y->dx == NULL) {
res = Y->sx;
free(Y);
} else
if (Y->sx == NULL) {
res = Y->dx;
free(Y);
} else {
printf("Can't eliminate that!\n");
}
}
return res;
}
从main
拨打电话:
tree T;
...
printf("Which one you want to destroy? ");
if (scanf("%d", &elem) == 1)
T = destroy_node(T, elem);
当然,你必须找到一个删除带有2个分支的节点的解决方案。