В моем коде есть два экземпляра (назначение дерева двоичного поиска), из-за которых Project1.exe перестает работать. Я понятия не имею, что вызывает эту ошибку, единственное, что я могу догадаться, это, возможно, доступ к NULL памяти ... (Я довольно плохо знаком с dev-c ++ и программированием в целом.)
Ошибка исчезнет, если Я закомментирую мою функцию exist ():
// PURPOSE: Returns true if a node with the value val exists in the tree
// otherwise, returns false
bool BinarySearchTree::exists( BinarySearchTree::TaskItem val ) const {
BinarySearchTree::TaskItem* cur = root;
while(cur) {
if((*cur) == val) return true;
if(val.priority < cur->priority)
cur = cur->left;
else
cur = cur-> right;
}
return false;
}
или если я оставлю эту первую строку в моей функции remove (); exe аварийно завершает работу, если я закомментирую это:
// PURPOSE: Removes the node with the value val from the tree
// returns true if successful; returns false otherwise
bool BinarySearchTree::remove( BinarySearchTree::TaskItem val ) { // tricky
if(exists(val) == false) return false;
BinarySearchTree::TaskItem* cur = root;
BinarySearchTree::TaskItem* parent = NULL;
// iterate downwards until cur points to a node
// that equals delete_node
while(!((*cur) == val)) {
// update cur and parent as you are traversing
// through this tree
if(val.priority < cur->priority) {
parent = cur;
cur = cur->left;
} else {
parent = cur;
cur = cur->right;
}
}
// check that we have not reached NULL
// if we have reached NULL, return false
if(!cur) return false; // why tho
// divide the code into cases
// CASE 1: remove the leaf node
if (!cur->left && !cur->right) {
// decide where is cur in reference to parent
// example: if (cur == parent->left)
// free up cur's memory
// set parent's pointer to NULL
if(cur == parent->left) {
delete cur;
cur = NULL;
parent->left = NULL;
} else if(cur == parent->right) {
delete cur;
cur = NULL;
parent->right = NULL;
}
// CASE 2: remove a node with only one child
} else if(!cur->left) {
if(cur == parent->left) {
parent->left = cur->right;
delete cur;
cur = NULL;
} else if(cur == parent->right) {
parent->right = cur->right;
delete cur;
cur = NULL;
}
} else if(!cur->right) {
if(cur == parent->left) {
parent->left = cur->left;
delete cur;
cur = NULL;
} else if(cur == parent->right) {
parent->right = cur->left;
delete cur;
cur = NULL;
}
}
else { // CASE 4:
// find succ and parent of succ
BinarySearchTree::TaskItem* parent_succ = cur;
BinarySearchTree::TaskItem* succ = cur->right;
while(succ->left) {
parent_succ = succ;
succ = succ->left;
}
// swap values of successor and to-delete node
BinarySearchTree::TaskItem* temp = succ;
succ->priority = cur->priority;
succ->description = cur->description;
cur->priority = temp->priority;
cur->description = temp->description;
parent_succ->right = succ->right;
delete succ;
succ = NULL;
}
size ++;
return true;
}
Если это помогает (а не публикует мою функцию insert ()), я на 99% уверен, что код вставляется правильно, потому что он проходит эти тестовые случаи.
Буду признателен за любые рекомендации :)