动态数据排序
题目要求
编写一个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();
}