排序链表xstring中的元素时出现未处理的异常

时间:2013-12-24 19:58:52

标签: c++ sorting exception-handling singly-linked-list dynamic-variables

我正在开展一个学校项目,我需要做的是按字母顺序对单个链表中的元素(字符串)进行排序。

我认为我可以创建一个动态数组并用列表中的元素填充它,并在数组排序后将元素发送回列表。当我第一次要求程序对它进行排序时,它工作得很好。但是,当我再次调用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;
    }
}

1 个答案:

答案 0 :(得分:0)

addToTail功能出错。您不会将tail成员变量更新为新节点。此外,使用while搜索尾节点是不必要的,因为您可以通过tail直接访问它。

您的addToHead功能也有错误,但这里并不重要。您正在分配一个始终泄漏的新temp节点。

或许修复这些错误已经足够了。如果不是,您应该显示removeFromHead。我猜它与head变量混淆并将其置于某种“未初始化或陈旧”状态,以便下次访问head->next时崩溃。