Я пытаюсь выяснить, как очистить стек (в виде связанного списка). Связанные списки не являются моей сильной стороной; Я их вообще не понимаю. Здесь мой код, может ли кто-нибудь пролить свет на то, почему он не работает? Когда я пытаюсь вызвать метод с помощью главного переключателя, кажется, что он застрял в бесконечном цикле.
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;
}
}
}
Есть несколько проблем с этим кодом. Во-первых, вы разыскиваете неинициализированный указатель (temp
) другого, что вы delete
next
указатель перед циклом (и, таким образом, вытаскиваете ковер под ваши собственные ноги, так сказать).
Это так просто, как
node* next;
for (node* current = top; current != nullptr; current = next)
{
next = current->next;
delete current;
}
О, и не забудьте очистить top
когда закончите.
for
и объявить next
с той же областью действия. Просто для удовольствия ;-) (как в моем комментарии к вопросу).
top
по списку по ходу работы, и вам не придется очищать его, когда вы закончите.
Вы не инициализировали temp
. Вам нужно установить temp
для первого узла списка. Внутри цикла пройдите через узлы и продолжайте их удалять.
node *current = top;
node *temp = top; // initialize temp to top
while(current != NULL);
{
temp = temp -> next; // increase temp
delete current;
current = temp;
}
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
.
Думайте, это то, что вы хотели:
node *current = top;
while(current != NULL);
{
node *temp = current->next;
delete current;
current = temp;
}
top = null;
temp
не удосужившись инициализировать.