我的代码运行错误!在输入并排序列表中的一些数字后,对于某些数字,它不起作用,并删除旧节点或不显示它们。我搞不懂怎么回事。
有时它看起来工作得很好,例如:我输入了4、6、7、2,它确实显示在排序列表中。但在输入3之后,它没有在列表中显示3。
这是我的代码:
if(head == NULL)
{
head = info;
last = info;
info->next = NULL;
}
else
{
if(info->number > last->number)
{
last->next = info;
last = info;
info->next = NULL;
}
else if (info->number < head->number )
{
info -> next = head;
head = info;
}
prev = head;
for(temp = head-> next ; temp!= NULL; temp = temp->next)
{
prev = prev->next;
if(info->number >temp->number)
{
temp->next = info;
}
else
{
temp-> prev = info;
info = prev;
}
}
}
if(head == NULL)
{
head = info;
last = info;
info->next = NULL;
}
else
{
if(info->number >= last->number) <-- CHANGE:: > changed to >= to take care of same number (as earlier stored number) being entered
{
last->next = info;
last = info;
info->next = NULL;
return; <-- CHANGE:return added here, no need to proceed further
}
else if (info->number <= head->number) <-- CHANGE:: < changed to <= to take care of same number (as earlier stored number) being entered
{
info -> next = head;
head = info;
return; <-- CHANGE:return added here, no need to proceed further
}
prev = head;
for(temp = head->next ; temp != NULL; temp = temp->next)
{
if(temp->number >= info->number) <-- CHANGE: modified code when insertion happens between head and last
{
prev->next = info;
info->next = temp;
break;
}
prev = temp;
}
}
在您的原始代码中,最后一种情况是:
else
{
temp-> prev = info;
info = prev;
}
这个代码没有任何意义,因为您提到了单链表,但在这里您使用了"temp->prev"。
毫无疑问,您的代码中有减少代码大小的空间(如果可以删除检查并直接执行"for"循环以插入新元素)
if(head == NULL)
{
head = info;
last = info;
info->next = NULL;
last=info;
}
else
{
if(info->number>head->number){
info->next=head;
head = info;
}
else{
tmp=prev=head;
while(tmp && (info->number < tmp->number) )
{
prev=tmp;
tmp=tmp->next;
}
info->next=prev->next;
prev->next=info;
if(!tmp) last=info;
}
}
考虑将其构建为一个数组,对数组进行排序,然后从中使用它。
您使用的是冒泡排序,这不是最快的排序方式。
幸运的是,您的C库很可能提供一种高效的快速排序算法(qsort
)。将其与链接列表一起使用:
- 分配(使用
malloc
)大小等于链表中项目数的指针数组 - 遍历链表,使数组的每个条目都指向链表中的一个项
- 使用
qsort
和指定的比较例程对指针进行排序 - 遍历数组,根据需要设置每个元素的上一个和下一个指针(即完全忽略以前的链接)
- 释放数组
这几乎总是比交换实际元素的next
和prev
指针更快,而且不太容易出错。
如果你坚持使用冒泡排序,你可以简单地用冒泡排序代替第三步。
您不是在对"单链表"进行排序,而是在用户提供输入时尝试对列表进行排序。此外,您正在处理的列表看起来不像一个单独的链表。它同时有"next"one_answers"prev"指针,所以它应该是一个"双链表"。
从实现单个列表开始,将项目添加到末尾。只要稍微调整一下,你就可以把它整理好。不要每次都要添加项目,而是要找到列表中第一个大于或等于要添加项目的项目,然后在它之前插入新项目。如果找不到这样的项目,则说明您在最后。你的物品会更大。把它加到最后。