Я разработал функцию удаления всех узлов из связанного списка. Все узлы успешно удалены, кроме последнего. Пожалуйста, помогите мне, почему последний узел не удаляется? Ниже приведен мой код:

void StudentLinkList::removeAll() {
    StudentData *traversePointer = this->head;

    while (this->head->getNext() != nullptr) {
        this->head = this->head->getNext();
        delete traversePointer;
        traversePointer = this->head;
    }

    delete this->head;
}
-2
Idrees Ashraf 20 Мар 2017 в 00:30

2 ответа

Лучший ответ

Вы удаляете this-> head, но вы должны также установить this-> head в nullptr. Пока вы освобождаете память, которую использует узел, данные, хранящиеся в старом расположении узла, обычно не сразу перезаписываются, поэтому похоже, что последний узел не был удален.

РЕДАКТИРОВАТЬ: downvote должным образом отмечен, кто-то может уточнить, что я ошибся?

Кроме того, я согласен с приведенным выше комментарием - вы также должны проверить, равен ли this-> head нулю перед циклом.

0
Anish Goyal 19 Мар 2017 в 21:35

Так близко

void StudentLinkList::removeAll() {
    StudentData *traversePointer;

    // Continue while there are any elements on the list
    // Extra parens to indicate that we want the result of the 
    // assignment as boolean.  No need to compare to nullptr.
    while ( (traversePointer = this->head) ) {
        // First preserve the rest of the list
        this->head = this->head->getNext();
        // only then can we delete this node
        delete traversePointer;
    }
    // list is now empty
}
1
stark 19 Мар 2017 в 21:40