Как вы могли бы установить указатель, на который указывает указатель, на nullptr в C ++? - PullRequest
0 голосов
/ 21 апреля 2020

Я создал класс структуры данных дерева, который выделяет память для реализации узла. Функция удаления успешно находит и удаляет выделенную память для узла дерева, но у меня проблемы с установкой фактического узла в nullptr. Моя функция удаления создает указатель узла дерева и устанавливает его в адрес удаляемого узла. Я удаляю этот указатель и устанавливаю его в nullptr, но узел дерева затрагивается только удалением и не устанавливается в nullptr. Поэтому, это становится мусором и портит мою программу.

Проблема начинается со случая 2, где моя функция удаления проверяет, является ли узел листом.

template <class DType>
bool Tree<DType>::remove(DType toDelete)
{
    if (head == nullptr) {
        return false;
    } 

    if (!check_existence(toDelete)) // CASE 1: Node does not exist.
    {
        std::cout << "Remove Error: " << toDelete << " does not exist." << std::endl;
        return false;
    }

    TreeNode<DType>* nodeToDelete = find(toDelete); // Address of node to be deleted.
    TreeNode<DType>* nodeToDelete_left = nodeToDelete->get_left();
    TreeNode<DType>* nodeToDelete_right = nodeToDelete->get_right();

    if (!(nodeToDelete_left) && !(nodeToDelete_right)) // CASE 2: Node is a leaf.
    {
        nodeToDelete->delete_nodes(nodeToDelete);
        nodeToDelete = nullptr;
        nodeCount--;
        return true;
    }

    TreeNode<DType>* temp = nullptr;

    if ((nodeToDelete_left != nullptr) ^ (nodeToDelete_right != nullptr)) // CASE 3: Node has one child.
    {
        temp = nodeToDelete;

        if (nodeToDelete_left) // 3A: Left child exists
        {
            nodeToDelete = nodeToDelete_left;
        }
        if (nodeToDelete_right) // 3B: Right child exists.
        {
            nodeToDelete = nodeToDelete_right;
        }
        delete temp;
        temp = nullptr;
        nodeCount--;
        return true;
    }
    // CASE 4: Node has two children
    temp = find_min(nodeToDelete_right);
    nodeToDelete->set_data(temp->get_data());
    delete temp;
    temp = nullptr;
    nodeCount--;
    return true;
}

Ответы [ 2 ]

1 голос
/ 22 апреля 2020
DType x;
DType* ptr = &x;
DType** ptrptr = &ptr;

std::cout << ptr << '\n'; // some address will be printed

// setting a pointer a pointer is pointing to, to nullptr by dereferencing the
// pointer-pointer
*ptrptr = nullptr;

std::cout << ptr << '\n'; // nullptr representation (0) printed
0 голосов
/ 21 апреля 2020

Вы берете копию указателя, возвращенного find. Установка nullptr не изменит значение оригинала (однако вы можете удалить объект, на который указывает оригинал).
Убедитесь, что find возвращает ссылку на указатель (например, TreeNode<DType>*&) и что ваши переменные объявлены соответственно (например, TreeNode<DType>*& nodeToDelete).

...