Не можете понять, как очистить связанный список в C ++?

0

Я пытаюсь выяснить, как очистить стек (в виде связанного списка). Связанные списки не являются моей сильной стороной; Я их вообще не понимаю. Здесь мой код, может ли кто-нибудь пролить свет на то, почему он не работает? Когда я пытаюсь вызвать метод с помощью главного переключателя, кажется, что он застрял в бесконечном цикле.

void stack :: clearStack()
{
if (isEmpty()== true)
{
    cout << "\nThere are no elements in the stack. \n";
}

else 
{
    node *current = top;
    node *temp;
    while(current != NULL);
    {
        current = temp -> next;
        delete current;
        current = temp;
    }
}

}
  • 1
    Похоже, вы используете temp не удосужившись инициализировать.
  • 2
    Я думаю, что вы должны прочитать больше и попытаться понять их лучше
Показать ещё 2 комментария
Теги:
list
linked-list
stack

4 ответа

2

Есть несколько проблем с этим кодом. Во-первых, вы разыскиваете неинициализированный указатель (temp) другого, что вы delete next указатель перед циклом (и, таким образом, вытаскиваете ковер под ваши собственные ноги, так сказать).

Это так просто, как

node* next;
for (node* current = top; current != nullptr; current = next)
{
    next = current->next;
    delete current;
}

О, и не забудьте очистить top когда закончите.

  • 0
    +1, и я думаю, что вы можете воспользоваться преимуществом for и объявить next с той же областью действия. Просто для удовольствия ;-) (как в моем комментарии к вопросу).
  • 1
    Поскольку вы стираете список, вы можете перемещаться top по списку по ходу работы, и вам не придется очищать его, когда вы закончите.
0

Вы не инициализировали temp. Вам нужно установить temp для первого узла списка. Внутри цикла пройдите через узлы и продолжайте их удалять.

node *current = top;
node *temp = top; //    initialize temp to top
while(current != NULL);
{
    temp = temp -> next; // increase temp
    delete current;
    current = temp;
}
0
if (isEmpty()== true)
{
    cout << "\nThere are no elements in the stack. \n";
}
else 
{
    node *current = top;
    node *temp;
    while(current != NULL);
    {
        current = temp -> next;
        delete current;
        current = temp;
    }
}

Весь этот блок можно заменить следующим:

while (top != nullptr)
{
    unique_ptr<node> p(top);
    top = top->next;
}

Если список уже пуст, ничего не делается. Если он не пуст, unique_ptr управляет управлением памятью текущей top (которая удалит ее между итерациями цикла), переместите top в next. Когда top имеет NULL, все очищается, а top - NULL.

0

Думайте, это то, что вы хотели:

node *current = top;
while(current != NULL);
{
    node *temp = current->next;
    delete current;
    current = temp;
}
top = null;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню