Я работаю над школьным проектом, и мне нужно сделать это, чтобы отсортировать элементы (строки) в круглом одиночном списке по алфавиту.
Я думал, что могу создать динамический массив и заполнить его элементами из списка и отправить элементы обратно в список после сортировки массива. Он отлично работает, когда я сначала попрошу программу отсортировать его. Однако, когда я снова вызываю функцию сортировки, она дает ошибку. Ошибка возникает в строке 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;
}
}
В вашей функции addToTail
есть ошибка. Вы не обновляете переменную tail
в новый узел. Также поиск хвостового узла с использованием, в while
как нет необходимости, потому что у вас есть прямой доступ к нему через tail
.
Также есть ошибка в вашей функции addToHead
но здесь это не важно. Вы назначаете новый temp
узел, который всегда будет течь.
Возможно, исправление этих ошибок уже достаточно. Если это не так, вы должны показать свой removeFromHead
. Я предполагаю, что это портит с head
переменной и оставлю его в каком - то "неинициализированном или несвежем" состоянии, так что следующий доступ к head->next
авариям.
std::string
я предполагаю, что вы используете удаленный или устаревший элемент в своем классе списка.