Перколяция левой кучи C++ приводит к ошибке сегмента

Я реализовал removeSelection функция, которая удаляет определенный узел из левой кучи. Код находит узел через хеш-таблицу, которая отслеживает ключи, которые были вставлены в кучу. Затем узел перколируется в корень кучи и deleteMin вызывается, чтобы удалить его. Код, кажется, терпит неудачу в swapWithParent функция, которая percolateUp звонки, и это генерирует ошибку сегмента.

Эта функция вызывается из main в куче:

    bool removeSelection( const Comparable & x )
{
    LeftistNode * temp = locateNode( x ); //find the node with the item
    if(temp == NULL)
        return false;
    //percolate that node to the top
    percolateUp(temp);
    //delete the root
    int derp = 0; //deleteMin requires an int be passed
    deleteMin(derp);
    return true;

}

percolateUp функция:

    void percolateUp( LeftistNode * t )
{
    if(t != NULL)
    {
        while(t != root)
        {
            t = swapWithParent(t->parent, t);
        }
    }
}

swapWithParent функция:

    //swap h2 with its parent h1
//return pointer to h2's new location
LeftistNode * swapWithParent(LeftistNode * h1, LeftistNode * h2)
{
    //if h2 is its parent's left child
    if(h2 == h1->left)
    {
        LeftistNode *temp = new LeftistNode(h2->element, -1, h1->parent, h1->left, h1->right, h1->npl); //clone h1 and store as a temp

        temp->lines = h2->lines;

        //update all pointers
        h1->parent = h2;
        if(h1->right != NULL)
            h1->right->parent = h2;
        h1->left = h2->left;
        h1->right = h2->right;
        h2 = temp;
        return h2;
    }
    else
    {
        LeftistNode *temp = new LeftistNode(h2->element, -1, h1->parent, h1->left, h1->right, h1->npl); //clone h1 and store as a temp
        temp->lines = h2->lines;
        //update all pointers
        h1->parent = h2;
        if(h1->left != NULL)
            h1->left->parent = h2;
        h1->left = h2->left;
        h1->right = h2->right;
        h2 = temp;
        return h2;

    }
}

Возможно, есть места, где я могу разыменовать нулевой указатель? Я проверил, но я не могу найти ошибку.

1 ответ

Если t->parent NULL в вызове t = swapWithParent(t->parent, t); тогда вы будете обращаться к пустому указателю в swapWithParent(), Если parent разрешено быть NULL, затем добавьте проверку в swapWithParent(), и если это не должно быть NULL, то, по крайней мере, добавьте assert() чтобы убедиться, что он не установлен в NULL по ошибке.

Другие вопросы по тегам