почему при удалении списка ссылок не может корректно работать «удалить из головы»? - PullRequest
0 голосов
/ 30 апреля 2019

Я реализую следующий код для удаления элемента в Head.Когда программа выполнит команду «удалить p», это повлияет на предыдущую Голову, и Голова получит значение NULL.Что случилось?

    Node<T>* p;
    p = Head;
    Head = Head->next;
    delete p;

1 Ответ

1 голос
/ 30 апреля 2019

Эта функция удалит 1-й узел (узел, на который указывает голова).Он возвращает истину, если узел был удален, иначе ложь, если список пуст.

Использование двойных указателей для входного параметра (заголовок) здесь, потому что заголовок должен быть обновлен, и это значение должно отражаться вне этой функции.

bool deleteHeadElement(Node** head)  
{
    if (*head == nullptr)
    {
        // List is empty, nothing to delete
        return false;
    }

    // Store the node that has to be deleted
    Node* nodeToDelete = *head;

    // Update the head to point to next nodeToDelete
    *head = nodeToDelete->next;

    delete nodeToDelete;

    // 1st element of node has been deleted.
    return true;
}

После вызова этой функции вы можете впоследствии вызвать ее, и она позаботится о сценарии, в котором список становится пустым после предыдущих вызовов.

ПРИМЕЧАНИЕ. Относительно значения0xfeeefeee, кажется, вы пытаетесь каким-то образом освободить уже освобожденную память.Возможно, вам следует проверить, правильно ли обновляется ваша голова.

Кроме того, убедитесь, что вы освобождаете память узла, используя delete, только если он был выделен с помощью new.delete заботится, если указанная память равна NULL.

Если вы выделили память для узла с помощью malloc (), вы должны освободить ее с помощью free ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...