Как устранить ошибку в коде и интерпретировать сообщение об ошибке

Поэтому я работаю над проектом, используя связанные списки. Программа в основном принимает числа до ввода -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;

Код для deleteAll выглядит следующим образом:

    template <class Type>
void UnorderedLinkedList<Type>::deleteAll(const Type& 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

Извините, что опубликовал большой вопрос, но может ли кто-нибудь объяснить, что означает ошибка в этой ситуации и что я делаю, что вызывает это? Спасибо!

0

Решение

За 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 = &(*curr)->link)
{
if ((*curr)->info < (*smallest)->info)
{
prev = back;
smallest = curr;
}
}

Node* temp = *smallest;
*smallest = (*smallest)->link;

if (prev)
prev->link = *smallest;
delete temp;
}
0

Другие решения


По вопросам рекламы [email protected]