我正在开展一个学校项目,我需要做的是按字母顺序对单个链表中的元素(字符串)进行排序。
我认为我可以创建一个动态数组并用列表中的元素填充它,并在数组排序后将元素发送回列表。当我第一次要求程序对它进行排序时,它工作得很好。但是,当我再次调用sort函数时,它会出错。错误发生在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功能有问题。它确实为尾部添加了新元素。
但是,当我在sort函数中使用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 :(得分:0)
addToTail
功能出错。您不会将tail
成员变量更新为新节点。此外,使用while
搜索尾节点是不必要的,因为您可以通过tail
直接访问它。
您的addToHead
功能也有错误,但这里并不重要。您正在分配一个始终泄漏的新temp
节点。
或许修复这些错误已经足够了。如果不是,您应该显示removeFromHead
。我猜它与head
变量混淆并将其置于某种“未初始化或陈旧”状态,以便下次访问head->next
时崩溃。