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

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

Я думал, что мог бы создать динамический массив и заполнить его элементами из списка и отправить элементы обратно в список после сортировки массива. Это прекрасно работает, когда я впервые прошу программу отсортировать его. Однако, когда я снова вызываю функцию сортировки, она выдает ошибку. Ошибка происходит на линии 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

Решение

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

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

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

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector