首页 > 代码库 > 链表的冒泡排序

链表的冒泡排序

#include<stdio.h>
#include<stdlib.h>
struct link
{
    int data;
    struct link *next;
};
struct link *invent(void);
struct link *sort(struct link *head);
void outp(struct link *head);
int main()
{
    struct link *head,*p;
    printf("创建一个链表。\n");
    head=invent();
    p=head;
    outp(p);
    printf("排序后结果为:\n");
    p=sort(head);
    outp(p);
    return 0;
}
struct link *invent(void)
{
    struct link *head=NULL,*tail,*new;
    int n=0;
    while(1)
    {
        new=(struct link *)malloc(sizeof(struct link));
        printf("请输入第%d个数据,输入-1结束:",n+1);
        scanf("%d",&new->data );
        new->next =NULL;
        if(new->data=http://www.mamicode.com/=-1)
        {
            free(new);
            return  head;
        }
        else
        {
            n++;
            if(n==1)
            {
                head=tail=new;
            }
            else
            {
                tail->next =new;
                tail=new;
            }
        }
    }
}
void outp(struct link *head)
{
    while(head)
    {
        printf("%d\n",head->data );
        head=head->next ;
    }
 } 
struct link *sort(struct link *head)
{
    struct link *tail,*p,*q;
    int temp=0;
    int flag=0;
    tail=head;
    while(tail->next !=NULL) /*给tail初始化,指向最后一个节点。*/ 
    {
        tail=tail->next;
    }
    while(head!=tail)  /*每循环一次,让tail指向它前面的结点,当tail=head时循环结束。*/ 
    {
        p=head;  /*记得每次都要初始化*/ 
        while(p != tail) /*当p==tail时,再与p->next 便没有意义了。*/ 
        {
            if(p->data > p->next->data ) /*满足条件,交换两个数据域数据*/ 
            {
                temp=p->data ;
                p->data =http://www.mamicode.com/p->next->data ;
                p->next->data =http://www.mamicode.com/temp;
                flag=0; /*记录是否满足过条件*/ 
            }
            q=p; /*q记录tail前面的结点位置*/ 
            p=p->next ;
        }
        if(flag) /*优化(如果flag的值一直没有发生过改变,则表明已经排序好)*/ 
        {
            break;
        } 
        tail=q; /*tail指向前面一个节点*/ 
    }
    return head;
}

结构图:

技术分享

直接交换结点的数据域数据就好,千万不要交换结点的位置,费力不讨好。

链表的冒泡排序