• 链表的冒泡排序


    #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("创建一个链表。
    ");
        head=invent();
        p=head;
        outp(p);
        printf("排序后结果为:
    ");
        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
    ",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;
    }

    结构图:

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

  • 相关阅读:
    SQL Server中的Merge关键字
    详解公用表表达式(CTE)
    SQL Server优化50法
    Chrome下的脚本管理器
    初步设计了一下视频工具合集的界面
    迅雷的剪贴板冲突好强大
    在C#中用MediaInfo获取视频或音频的属性
    用Command模式简单的实现Undo&Redo功能
    用DoddleReport快速生成报表
    移动支付时代早日来临吧
  • 原文地址:https://www.cnblogs.com/TX980502/p/6683068.html
Copyright © 2020-2023  润新知