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

#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;
}