渗透C ++左派堆会导致seg错误

时间:2012-03-28 04:15:06

标签: c++ pointers segmentation-fault leftist-tree

我已经实现了一个removeSelection函数,用于从左侧堆中删除特定节点。代码通过哈希表定位节点,哈希表跟踪已插入堆中的键。然后将该节点渗透到堆的根,并调用deleteMin来删除它。代码似乎在swapWithParent调用的percolateUp函数中失败,并且它会生成seg错误。

这是从堆上的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;

    }
}

是否有任何我可能会取消引用NULL指针的地方?我已经检查了,但我似乎无法找到错误。

1 个答案:

答案 0 :(得分:0)

如果调用t->parent中的t = swapWithParent(t->parent, t);为NULL,那么您将在swapWithParent()中使用NULL指针。如果允许parent为NULL,则在swapWithParent()中添加一个检查,如果它不应该为NULL,则至少添加一个assert()以确保它没有被错误地设置为NULL。