向结构指针分配NULL不能通过函数进行。该怎么办?

时间:2019-05-01 06:21:32

标签: c pointers

我正在尝试删除BST。根据算法,我们可以直接删除叶子。现在,我直接将NULL分配给叶子,并且该节点仍然保持原样。

在测试用例中,我尝试删除叶子,但它不起作用。

请帮助!

struct node * delet(long data, struct node* root)
{
    int i=1;
    struct node *temp = root,*t;

    while(temp != 0)
    {
        if(data < temp->data)
        {
            i=2*i;
            temp = temp->l;
        }
        else if(data > temp->data)
        {
            i = (2*i)+1;
            temp = temp->r ;
        }
        else
        {
            printf("%d\n",i);
            break;
        }
    }
    if(temp->l == 0 && temp->r == 0)
    {
        temp = 0;
        return root;
    }
    else if(temp->l == 0)
    {
        temp->data = temp->l->data;
        temp->l = 0;
    }
    else if(temp->r == 0)
    {
        temp->data = temp->r->data;
        temp->r = 0;
    }
    else
    {
        t = temp;
        t = t->r;
        while(t->l != 0)
        {
            t = t->l;
        }
        temp->data = t->data;
        if(t->r != 0)
        {
            t->data = t->r->data;
            t->r = 0;
            return root;
        }
        else
        {
            t = 0;
            return root;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

temp = 0;不会从树中删除叶子,只是使局部变量为空。 您想使某个节点的lr为空,以便从树中删除一个节点。 尝试保持父节点也好,一旦温度指向叶子,则使temp的父节点rl无效。

稍后,t = 0;也将继续使用。

请注意David's comment,有关首先释放此内存。

例如(假设不删除根):

...
        if(data < temp->data)
        {
            i=2*i;
            parent = temp;
            temp = temp->l;
        }
        else if(data > temp->data)
        {
            i = (2*i)+1;
            parent = temp;
            temp = temp->r ;
        }
        else
        {
            printf("%d\n",i);
            break;
        }
...
    if(temp->l == 0 && temp->r == 0)
    {
        if (parent->l == temp)
             parent->l = 0;
        else
             parent->r = 0;
        // Free temp if needed
        return root;
    }
...

还请注意,您拥有:

    else if(temp->l == 0)
    {
        temp->data = temp->l->data;

这是对空指针的取消引用(temp->l为NULL),对于temp->r == 0情况也是一样。

那么你有

         temp->l = 0;

但是您已经处于temp->l == 0案中,所以我认为这不是您的意思。