Перколяция левой кучи 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 по ошибке.