#c #eclipse #stack-dump
#c #eclipse #дамп стека
Вопрос:
Итак, я работаю над проектом, использующим связанные списки. Программа в основном принимает числа до тех пор, пока не будет введено значение -999, а затем выполняет операции с ним. Две операции, с которыми у меня возникают проблемы, — это deleteAll, когда из списка удаляются все одинаковые значения, и deleteSmallest, когда удаляется наименьшее значение в списке. Код, вызывающий обе функции, выглядит следующим образом:
int num;
cout << "Enter a number you would like deleted from the whole list: ";
cin >> num;
uList.deleteAll(num);
cout << "New list: " << uList << endl;
uList.deleteSmallest();
cout << "After deleting the smallest number, the list now is: " << uList << endl;
Код для удаления всего следующий:
template <class Type>
void UnorderedLinkedList<Type>::deleteAll(const Typeamp; deleteItem)
{
NodeType<Type>* curr;
NodeType<Type>* p = NULL;
NodeType<Type>* q = NULL;
curr = first;
if(first == NULL)
throw std::runtime_error("Cannot delete from an empty list");
else
{
for(int i = 0; i < count; i )
{
if(curr->info == deleteItem)
{
p = curr;
q = p->link;
p->link = q->link;
delete q;
}
curr = curr->link;
}
}
delete p;
delete curr;
}
Код для deleteSmallest выглядит следующим образом:
template <class Type>
void UnorderedLinkedList<Type>::deleteSmallest()
{
NodeType<Type>* curr;
NodeType<Type>* p;
NodeType<Type>* q;
NodeType<Type>* r;
curr = first;
if (first == NULL)
throw std::runtime_error("Cannot delete from an empty list");
else
{
for(int i = 0; i < count; i )
{
if(curr->link->info < curr->info)
{
int smallest = curr->link->info;
p = curr;
q = curr->link;
}
curr = curr->link;
}
}
r = q->link;
p->link = q->link;
delete q;
}
Ошибка, которую я получаю, это:
1 [main] Project 5 4044 cygwin_exception::open_stackdumpfile: Dumping stack trace to Project 5.exe.stackdump
Извините, что задаю большой вопрос, но может ли кто-нибудь объяснить, что означает ошибка в этой ситуации и что я делаю, из-за чего это возникает? Спасибо!
Комментарии:
1. Двойные удаления в нижней части вашего
deleteAll
очень подозрительны, как и случай обработки else (или его отсутствие), когда текущий элемент не совпадает.
Ответ №1:
Для deleteAll()
вы должны делать что-то вроде этого:
else
{
for (Node* prev = curr; curr != NULL; prev = curr, curr = curr->link)
{
if (curr->info == deleteItem)
{
NodeType<Type>* temp = curr;
curr = curr->link;
if (prev)
prev->next = curr;
delete temp;
}
}
}
Раньше у вас это было совсем не удалением curr
. Вам также следует удалить delete p
и delete curr
внизу, поскольку они избыточны.
И для deleteSmallest()
вам нужно сохранить указатель, указывающий на наименьший узел (и предыдущий узел, указывающий на предшествующий ему), чтобы по завершении цикла вы знали, что удалять:
else
{
Node* prev = NULL, **smallest;
for (Node** curr = smallest = head, *back(*head); *curr != NULL; back = *curr, curr = amp;(*curr)->link)
{
if ((*curr)->info < (*smallest)->info)
{
prev = back;
smallest = curr;
}
}
Node* temp = *smallest;
*smallest = (*smallest)->link;
if (prev)
prev->link = *smallest;
delete temp;
}