链表的冒泡排序

Posted T.X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表的冒泡排序相关的知识,希望对你有一定的参考价值。

#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==-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 =p->next->data ;
                p->next->data =temp;
                flag=0; /*记录是否满足过条件*/ 
            }
            q=p; /*q记录tail前面的结点位置*/ 
            p=p->next ;
        }
        if(flag) /*优化(如果flag的值一直没有发生过改变,则表明已经排序好)*/ 
        {
            break;
        } 
        tail=q; /*tail指向前面一个节点*/ 
    }
    return head;
}

结构图:

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

以上是关于链表的冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

链表的三种插入排序+冒泡排序

链表的冒泡排序

从数组冒泡排序迁移到链表冒泡排序

关于C语言链表的问题,一个排序的问题,按num排序,求大佬帮助,在线等~!有点急~!

数据结构——链表的基本操作

链表选择排序的C语言算法实现