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