Перестал работать dev-c ++ project1.exe, проблема с доступом к NULL памяти? - PullRequest
0 голосов
/ 31 марта 2020

В моем коде есть два экземпляра (назначение дерева двоичного поиска), из-за которых 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% уверен, что код вставляется правильно, потому что он проходит эти тестовые случаи.

Буду признателен за любые рекомендации :)

...