无法尝试从树中删除节点(struct)

时间:2017-09-22 17:34:38

标签: c struct tree

正如标题所说我试图从有两种情况的树中删除一个节点:

  • 节点是未连接任何内容的叶子
  • 节点连接到另一个节点

我能够为第二种情况(对我来说最困难)制作一个工作函数,但第一种情况(看起来很容易)会导致分段错误,无论我尝试什么。

这是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。如果关于程序的可理解性存在问题,我将复制粘贴整个文件

1 个答案:

答案 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个分支的节点的解决方案。