Необработанное исключение при сортировке элементов в связанном списке xstring

0

Я работаю над школьным проектом, и мне нужно сделать это, чтобы отсортировать элементы (строки) в круглом одиночном списке по алфавиту.

Я думал, что могу создать динамический массив и заполнить его элементами из списка и отправить элементы обратно в список после сортировки массива. Он отлично работает, когда я сначала попрошу программу отсортировать его. Однако, когда я снова вызываю функцию сортировки, она дает ошибку. Ошибка возникает в строке temp[i] = head->info. Он показывает мне заголовочный файл xstring и говорит "необработанное исключение".

Я был бы так счастлив, если бы ты помог мне. Я думаю, что то, что мне не хватает, это очень простая вещь, и мне станет лучше, если я смогу узнать, что не так с этим кодом. Спасибо.

Редактировать:

template<class T>
class Node
{
    private:
        T Name;
        T Surname;
        T Email;
        T PhoneNumber;
    public:
        Node();
        Node(T Name, T Surname, T Email, T PhoneNumber);
        Node(Node& copy);
        ~Node();
        T getName();
        T getSurname();
        T getEmail();
        T getPhoneNumber();
        void setName(T Name);
        void setSurname(T Surname);
        void setEmail(T Email);
        void setPhoneNumber(T PhoneNumber);
        Node<T>& operator= (const Node&);
};

Это код для функции

template <class T>
void LinkedList<T>::sort()
{
    int sizeoflist = this->size();
    Node<T> *temp = new Node<T>[sizeoflist];
    for(int i=0; i<sizeoflist; i++)
    {
        temp[i] = head->info;
        this->removeFromHead();
    }

    //BUBBLE SORT
    for(int i=0; i<sizeoflist; i++)
    {
        for(int k=0; k<sizeoflist -1 -i; k++)
        {
            if(temp[k].getSurname() > temp[k+1].getSurname())
            {
                Node<T> temp2 = temp[k];
                temp[k] = temp[k+1];
                temp[k+1] = temp2;
            }
        }
    }

    //FILLING THE LIST
    for(int i=0; i<sizeoflist; i++)
    {
        this->addToTail(temp[i]);
    }
    delete[] temp;
}

Код перегрузки оператора присваивания для класса Node.

template<class T>
Node<T>& Node<T>::operator= (const Node<T>& newNode)
{
    if(this == &newNode)
        return *this;
    Name = newNode.Name;
    Surname = newNode.Surname;
    Email = newNode.Email;
    PhoneNumber = newNode.PhoneNumber;
    return *this;
}

Редактировать:

Я понял, что что-то не так с моей функцией addToTail. Он добавляет новые элементы в хвост.

Однако, когда я использую addToHead вместо addToTail в моей сортировке, он отлично работает после первого запуска.

Вот моя функция addToTail

template <class T>
void LinkedList<T>::addToTail(Node<T> newInfo)
{
    LinkedList<T> *node = new LinkedList<T>;
    node->info = newInfo;
    if(head==NULL)
    {
        head = node;
        tail = node;
        tail->next = head;
    }
    else
    {
        LinkedList<T> *temp = head;
        while(temp->next != head)
        {
            temp = temp->next;
        }
        temp->next = node;
        node->next = head;
    }
}

Функция addToHead

template <class T>
void LinkedList<T>::addToHead(Node<T> newinfo)
{
    LinkedList<T>* element = new LinkedList<T>;
    LinkedList<T>* temp = new LinkedList<T>;
    element->info = newinfo;
    if(head==NULL)
    {
        head = element;
        tail = element;
        tail->next = head;
    }
    else
    {
        temp = head;
        head = element;
        head->next = temp;
        tail->next = head;
    }
}
  • 0
    Они являются частными членами класса Node <T>. Я пытался использовать функции set и get на случай, если я что-то здесь не так делаю. Но я получил ту же ошибку потом.
  • 0
    Необработанное исключение почти всегда означает «использование неинициализированных или устаревших указателей». Поскольку xstring - это части реализации std::string я предполагаю, что вы используете удаленный или устаревший элемент в своем классе списка.
Показать ещё 10 комментариев
Теги:
sorting
exception-handling
dynamic-variables
singly-linked-list

1 ответ

0
Лучший ответ

В вашей функции addToTail есть ошибка. Вы не обновляете переменную tail в новый узел. Также поиск хвостового узла с использованием, в while как нет необходимости, потому что у вас есть прямой доступ к нему через tail.

Также есть ошибка в вашей функции addToHead но здесь это не важно. Вы назначаете новый temp узел, который всегда будет течь.

Возможно, исправление этих ошибок уже достаточно. Если это не так, вы должны показать свой removeFromHead. Я предполагаю, что это портит с head переменной и оставлю его в каком - то "неинициализированном или несвежем" состоянии, так что следующий доступ к head->next авариям.

  • 0
    Я не смог ответить на ваш вопрос, потому что для этого требуется 15 репутации. Я обновил хвостовой элемент, и ошибки исправлены. Я также исправил ошибку в моей функции addToHead. Спасибо большое за вашу помощь.
  • 0
    @ Волгаа, пожалуйста. Кстати, вы можете принять мой ответ, нажав на флажок под стрелками вверх / вниз.

Ещё вопросы

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