我的代码工作错误!输入并排序一些数量的列表后,对于某些数字,它不起作用并删除旧节点或不显示它们。无法弄清楚什么是错的。
有时看起来它工作正常,例如:我输入了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;
}
}
}
答案 0 :(得分:0)
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;
}
此代码没有任何意义,因为您提到了单链表,但在这里您使用了&#39; temp-&gt; prev&#39;。
当然,您的代码中可以减少代码大小(如果和其他 - 如果检查可以删除,并且直接执行&#39;循环执行以插入新元素)
答案 1 :(得分:0)
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;
}
}
答案 2 :(得分:0)
考虑将其构建为数组,对数组进行排序,并从那里使用它。
答案 3 :(得分:0)
您正在使用冒泡排序,这不是排序的最快方式。
幸运的是,您的C库很可能提供有效的快速排序算法(qsort
)。要将其与链表一起使用:
malloc
)和大小等于链表中项目数的指针数组。qsort
和指定的比较例程这几乎总是更快地交换实际元素的next
和prev
指针,并且不易出错。
如果您坚持使用冒泡排序,则可以通过冒泡排序替换第三步。
答案 4 :(得分:0)
您没有对“单个链接列表”进行排序您试图在用户提供输入时对列表进行排序。此外,您正在处理的列表看起来不像一个链表。它有“next”和“prev”指针,所以它应该是一个“双链表”。
从实施单个列表开始,将项目添加到最后。通过一些调整,您可以对其进行排序。每次要添加项目时都不要到列表的末尾,而是在列表中找到大于或等于要添加的项目的第一项,然后在它之前插入新项目。如果你找不到这样的物品,那么你就到了最后。你的物品将更大。只需将其添加到最后。