c语言动态数据排序

c语言动态数据排序

编码文章call10242025-06-15 15:09:281A+A-

题目要求:

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

题目分析:

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

#include <string.h> 
#include <stdio.h> 
#include <malloc.h>

/*定义int为ElemType类型*/
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;
        p->next=NULL;
        if(!list)
            list=p;
        else
            r->next=p;
        r=p;
    }
    return list;
}

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

/*销毁一个链表*/
void  destroyLinkList(LinkList *list){		
	LinkList p,q;
	p=*list;                
	while(p){	
	q=p->next;
	free(p);
	p=q;
	}
	*list=NULL;
} 


/*基于链表的冒泡排序算法*/
void Sort(LinkList q)
{
    LNode *p=q;
    int t,i,j,k=0;
    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 ",q->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);
	destroyLinkList(&l);
    getche();
}

运行结果:


点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4