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



我的代码运行错误!在输入并排序列表中的一些数字后,对于某些数字,它不起作用,并删除旧节点或不显示它们。我搞不懂怎么回事。

有时它看起来工作得很好,例如:我输入了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和指定的比较例程对指针进行排序
  • 遍历数组,根据需要设置每个元素的上一个和下一个指针(即完全忽略以前的链接)
  • 释放数组

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

如果你坚持使用冒泡排序,你可以简单地用冒泡排序代替第三步。

您不是在对"单链表"进行排序,而是在用户提供输入时尝试对列表进行排序。此外,您正在处理的列表看起来不像一个单独的链表。它同时有"next"one_answers"prev"指针,所以它应该是一个"双链表"。

从实现单个列表开始,将项目添加到末尾。只要稍微调整一下,你就可以把它整理好。不要每次都要添加项目,而是要找到列表中第一个大于或等于要添加项目的项目,然后在它之前插入新项目。如果找不到这样的项目,则说明您在最后。你的物品会更大。把它加到最后。

相关内容

  • 没有找到相关文章

最新更新