我正在尝试对单个链表进行排序

时间:2015-10-31 11:26:07

标签: c linked-list

我的代码工作错误!输入并排序一些数量的列表后,对于某些数字,它不起作用并删除旧节点或不显示它们。无法弄清楚什么是错的。

有时看起来它工作正常,例如:我输入了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;
        }
    }
}   

5 个答案:

答案 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和指定的比较例程
  • 对指针进行排序
  • 遍历数组,根据需要设置每个元素的上一个和下一个指针(即完全忽略之前的链接)。
  • 释放阵列

这几乎总是更快地交换实际元素的nextprev指针,并且不易出错。

如果您坚持使用冒泡排序,则可以通过冒泡排序替换第三步。

答案 4 :(得分:0)

您没有对“单个链接列表”进行排序您试图在用户提供输入时对列表进行排序。此外,您正在处理的列表看起来不像一个链表。它有“next”和“prev”指针,所以它应该是一个“双链表”。

从实施单个列表开始,将项目添加到最后。通过一些调整,您可以对其进行排序。每次要添加项目时都不要到列表的末尾,而是在列表中找到大于或等于要添加的项目的第一项,然后在它之前插入新项目。如果你找不到这样的物品,那么你就到了最后。你的物品将更大。只需将其添加到最后。