c语言单链表的排序问题

img


这个链表带头节点,但是进行排序操作后,结果并没有排序,如下就是没结果的图

img

你可以参考一下我这个排序,冒泡排序,而且效率比较高些。


/*
typedef struct List{
    int i;
    struct List* next;
}s;
*/
s* BubbleSort(s*head)
{
    if(head==NULL||head->next==NULL)     //如果链表为空或只有一个节点,直接返回 
        return head;
    if(head->next->next==NULL)            //对只有两个节点的单独处理 
    {
        if(head->i>head->next->i)
        {
            head->next->next=head;
            head=head->next;
            head->next->next=NULL;
        }
        return head;
    }
    //链表至少有三个节点    
    s*pleft=head,*p=pleft->next,*pright=p->next,*tem;
    int flag=1;
    while(flag)
    {
        pleft=head,p=pleft->next,pright=p->next;
        if(pleft->i>p->i)//因为之后的排序只能将除首节点之外的节点排序,所以我在这里对首节点进行处理 
        {
            head=p;
            p->next=pleft;
            pleft->next=pright;
            //此时三指针顺序为p pleft pright
            tem=p;
            p=pleft;
            pleft=tem;    
        } 
        flag=0;
        while(pright)
        {
            if(p->i>pright->i)
            {
                pleft->next=pright;
                p->next=pright->next;
                pright->next=p;            
                //此时三个指针的顺序为pleft,pright,p 
                tem=p;
                p=pright;
                pright=tem;
                flag=1;    
            }
            pleft=p;
            p=pright;
            pright=pright->next;
        }    
    }
    return head;    
}

img


你好好检查一下吧