C++ 使用C+中的选择排序对链表进行排序+;

C++ 使用C+中的选择排序对链表进行排序+;,c++,doubly-linked-list,selection-sort,C++,Doubly Linked List,Selection Sort,在尝试测试排序方法时,我遇到了某种运行时错误。在我的实现中,我试图在链表中找到最小的节点。。。接下来,我测试最小节点是第一节点,最后节点还是中间节点。在对这些情况进行测试之后,我尝试将最小的值添加到一个新的链表中。我这样做是为了所有的值都被排序,然后将head(我的类中的私有变量)指向新排序的列表。。。如果我需要包括我的头文件或其他任何东西,请让我知道。感谢您的帮助 要明确的是,没有实际的错误消息,当我调用sort函数时,程序只是被终止 void Linkedlist::sort() {

在尝试测试排序方法时,我遇到了某种运行时错误。在我的实现中,我试图在链表中找到最小的节点。。。接下来,我测试最小节点是第一节点,最后节点还是中间节点。在对这些情况进行测试之后,我尝试将最小的值添加到一个新的链表中。我这样做是为了所有的值都被排序,然后将head(我的类中的私有变量)指向新排序的列表。。。如果我需要包括我的头文件或其他任何东西,请让我知道。感谢您的帮助

要明确的是,没有实际的错误消息,当我调用sort函数时,程序只是被终止

void Linkedlist::sort()
{
    Node * current = head;
    Node * smallest = head;
    Node * newHead = NULL;
    Node * newTail = NULL;

    while(head != NULL)
    {
        current = head;
        while(current != NULL)
        {
            if(current->elem < smallest->elem)
            {
                smallest = current;
            }
            current = current->next; 
        }

        //smallest is first node
        if(smallest->prev == NULL)
        {
            head = head->next;
            head->prev = NULL;
        }

        //smallest is last node
        else if(smallest->next == NULL)
        {
            tail = tail->prev;
            tail->next = NULL;
        }

        else
        {
            smallest->prev->next = smallest->next;
            smallest->next->prev = smallest->prev;
        }

        //adding smallest to a new linked list
        if(newHead == NULL)
        {
            smallest->prev = NULL;
            smallest->next = NULL;
            newHead = smallest;
        }
        else
        {
            smallest->prev = newTail;
            smallest->next = NULL;
            newTail->next = smallest;
            newTail = smallest;
        }
    }
    //point head to new linked list
    head = newHead;

}
void Linkedlist::sort()
{
节点*电流=头部;
节点*最小=头部;
Node*newHead=NULL;
Node*newTail=NULL;
while(head!=NULL)
{
电流=水头;
while(当前!=NULL)
{
如果(当前->元素<最小->元素)
{
最小=电流;
}
当前=当前->下一步;
}
//最小的是第一个节点
如果(最小->上一个==NULL)
{
头部=头部->下一步;
head->prev=NULL;
}
//最小的是最后一个节点
else if(最小->下一步==NULL)
{
tail=tail->prev;
tail->next=NULL;
}
其他的
{
最小->上一个->下一个=最小->下一个;
最小->下一个->上一个=最小->上一个;
}
//将最小值添加到新的链接列表
if(newHead==NULL)
{
最小->上一个=空;
最小->下一个=空;
纽黑德=最小;
}
其他的
{
最小->上一个=新邮件;
最小->下一个=空;
newTail->next=最小值;
newTail=最小值;
}
}
//指向新的链接列表
head=新head;
}

将第一个元素添加到新的链接列表时,需要设置
newTail

否则,当对第二个新条目执行
newTail->next=minimable
时,它将是一个空指针访问

加上

newTail = smallest
之后

newHead = smallest
添加后

newTail = smallest
将最小的元素放入第一个节点时

smallest = head
在我的外部while循环的顶部,我仍然在运行一个无限循环。我发现,作为一个例子,我需要在结尾指出新尾巴,说

tail = newTail
在那之后,我的功能仍然导致了一个故障。此segfault是由于我试图访问NULL的prev成员造成的

head = head->next //head is now NULL
head->prev = NULL //segfault
当未排序列表中只剩下一个节点时,就会出现这种情况。我通过在if语句中添加if语句修复了这个问题,该语句检查最小的节点是否是第一个节点。内部的if语句检查它是否也是最后一个节点(即剩余的最后一个节点)

当剩下一个节点时,它将到达断点,并退出两个while循环。这意味着最后一个节点从未添加到排序列表中。为了解决这个问题,我在指向新列表之前使用了以下代码

smallest->prev = newTail;
smallest->next = NULL;
newTail->next = smallest;
newTail = smallest;

到底出了什么问题?您是否可以将错误消息复制到问题中?@Matt当我尝试调用排序函数时,程序刚刚终止。没有真正的错误消息,这就是为什么我在这里被难住了。你有没有用调试器处理过它?@Mark我试图在整个排序函数中使用cout行,但当程序终止时,我从未看到任何输出。我试着做的事和走路一样吗?如果没有,我将研究如何做到这一点。所以你没有像Visual Studio这样的IDE,它有一个集成的调试器?只是尝试在If语句的末尾添加newTail=minimest,现在没有实际的错误,它可以编译,但它确实会产生一个无限循环。一定要考虑使用调试器,当你可以单步执行程序时,发现这些类型的问题要容易得多。我认为无限循环是因为在旧链接列表中只剩下一个条目的情况下,你没有将
minimable
设置为任何值。这意味着最小值将保留为最后一个被删除的条目。在头的顶部添加
minimest=head
null)loop。另外,请不要编辑问题中的代码来解决问题-这意味着我的答案对其他任何人都没有任何意义。是的,很抱歉。我刚回到我上次修改的那篇文章。我将minimate=head添加到while循环的顶部,现在程序崩溃而不是无限循环。我现在将研究如何使用netbeans调试器。
smallest->prev = newTail;
smallest->next = NULL;
newTail->next = smallest;
newTail = smallest;