动态数列排序

动态数据排序

题目要求
编写一个c程序,实现这样的功能:从键盘输入任意个整数,以0作为结束标志,对这个整数序列从小到大排序,并输出排序后的结果。

题目分析
要实现动态数列排序,首先要选择好数据的存储结构。如果采用静态的线性存储结构,就无法实现此功能。因为静态线性存储结构的内存空间是开辟在内存的静态区,也就是栈内存上,它是在程序编译时就分配好了的,因此无法在程序运行时改变空间大小。
可以选择动态的顺序表或者链表作为数据的存储结构。在这里我用链表,因为链表的存储空间是分配在系统的动态区的,也就是堆内存上。


#include<string.h>
    #include<stdio.h>
    #include<malloc.h>
    typedef int Elemtype;

    typedef struct node{
          Elemtype data;
          struct node *next;
       }LNode,*Linklist;

    //创建一个长度为n的链表,并输入数据。
    Linklist  GreatLinklist(int n)
    {
         Linklist p,r,list=NULL
         Elemtype e;
         int i;
         for(i=1;i<=n;i++)
         {
             scanf("%d",&e);
             p=(Linklist)malloc(sizeof(LNode));
             p->data=e;
             if(!list)
                 list=p;
             else 
                 r->next=p;
            r=p;
         }
         return list;
    }

    //向链表中指针q指向的结点后面插入结点,并向该结点数据域中存放数据e
    void insertList(Linklist *list,Linklist q,Elemtype e)
    {
         Linklist p;
         p=(Linklist)malloc(sizeof(Elemtype));
         p->data=e;
         if(!*list)
         {
            *list=p;
            p->next=NULL;
         }
         else
         {
             p->next=q->next;
             q->next=p;
         }
    }

    //销毁链表
    void destoryLinklist(Linklist *list)
    {
         Linklist p,q;
         while(p)
         {
            q=p->next;
            free(p);
            p=q;
         }
         *list=NULL;
    }
    //基于链表的冒泡排序算法
    void Sort(Linklist q)
    {
        int i,j,t,k=0;
        LNode *p=q;
        while(p) {k++;p=p->next;}  //求长度
        p=q;
        for(i=0;i<k-1;i++)
        {
            for(j=0;j<k-i-1;j++)
            {
                if(p->data>p->next->data)
                {
                    t=p->data;
                    p->data=p->next->data;
                    p->next->data=t;
                }
               p=p->next;
            }
          p=q;         //保证每次从头访问
        }
    } 

   //打印出排序后的链表
   void print(Linklist q)
   {
      while(q)
      {
         printf("%d",p->data);
         q=q->next;
      }
  }

main()
{
    Elemtype e;
    Linklist l,q;     //定义一个链表l
    printf("Please input some integer digit and type 0 for end\n");
    q=l=GreatLinklist(1);    //创建一个链表结点,q和l指向该结点
    scanf("%d",&e);
    while(e)
    {
       insertList(&l,q,e);
       q=q->next;
       scanf("%d",&e);
    }
    Sort(l);
    print(l);
    destoryLinklist(&l);
    getche();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值