简单的排序应用代码实现

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define NUM 5
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef int Status;
typedef struct Volunteer
{
	int key;
	char name[15];
	int subject[NUM];
	int totalscore;
	int info;
}ElemType;
typedef struct
{
	ElemType *elem;
	int length;
	int listsize;
}SqList;
ElemType *p,*q,*newbase;
int i,j;
//构造空线性表
Status InitList(SqList &L)
{
	L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	L.length=0;
	L.listsize=LIST_INIT_SIZE;
	return TRUE;
}
//判断顺序表空否
Status ListEmpty(SqList L)
{
	if(L.elem)
	return TRUE;
	else
	return FALSE;
}
//获取某元素的位置(按值查找)
Status Search_Seq(SqList L,int key)
{
	int i=0;
	while(i<=L.length&&!EQ(L.elem[i].key,key))++i;
	if(i<=L.length)return i;
	else return FALSE;
}
//数据的按位插入
Status ListInsert(SqList &L,Status i,ElemType e)
{
	if(i<0||i>L.length+1)
	return FALSE;
	if(L.length>L.listsize)
	{
		newbase=(ElemType*)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREAMENT)*sizeof(ElemType));
		if(!newbase)
		exit(OVERFLOW);
		L.elem=newbase;
		L.listsize+=LISTINCREAMENT;
	}
	if(!L.length)
	{
		L.length++;
		L.elem[1]=e;
	}
	else
	{
		q=&(L.elem[i-1]);
		for(p=&L.elem[L.length-1];p>=q;--p)
		*(p+1)=*p;
		*q=e;
		L.length++;	
	}
	return TRUE;
}
//数据的按值删除
void ListDelete(SqList &L,int key,ElemType &e)
{
	int i=0;
	while(i<L.length)
	{
		if(EQ(L.elem[i].key,key))
		for(int j=i;j<L.length;j++)
		L.elem[j]=L.elem[j+1];
		else i++;
	}
	--L.length;
}
//显示数据
void PrintfSort(SqList L)
{
	printf("  学号    姓名      高数    英语    物理    离散    数结   平均成绩*\n");
	for(i=1;i<=L.length;i++)
	{
		printf("%5d%10s",L.elem[i].key,L.elem[i].name);
		for(j=0;j<NUM;j++)
			printf("%8d",L.elem[i].subject[j]);
		printf("%10.2f  *\n",(float)L.elem[i].totalscore/NUM);
	}
}
//文件导入
void enterdata(SqList &L)
{
	FILE *fp;
	int n=1,f;
	fp=fopen("stu.txt","r");
	if(fp==NULL)
		printf("打开文件错误!\n");
	else
	{
		while(!feof(fp))
		{
			fscanf(fp,"%5d%10s",&L.elem[n].key,&L.elem[n].name);
			L.elem[n].totalscore=0;
			for(i=0;i<NUM;i++)
			{
				fscanf(fp,"%d",&L.elem[n].subject[i]);
				L.elem[n].totalscore+=L.elem[n].subject[i];
			}
			n++;
		}
		L.length=n-1;
		printf("  %d名学生记录如下:                                                 *\n",n);
		PrintfSort(L);
	}
   	fclose(fp);
}
//直接插入排序
void InsretSort(SqList &L)
{
	for(i=2;i<=L.length;i++)
		if(LT(L.elem[i].info,L.elem[i-1].info))
		{
			L.elem[0]=L.elem[i];
			for(j=i-1;LT(L.elem[0].info,L.elem[j].info);j--)
				L.elem[j+1]=L.elem[j];
			L.elem[j+1]=L.elem[0];
		}
}
//冒泡排序
void BubbleSort(SqList &L)
{
	int change;
	for(i=L.length,change=TRUE;i>1&&change;i--)
	{
		change=FALSE;
		for(j-1;j<i;j++)
			if(LT(L.elem[j+1].info,L.elem[j].info))
			{
				ElemType temp=L.elem[j];
				L.elem[j]=L.elem[j+1];
				L.elem[j+1]=temp;
				change=TRUE;
			}
	}
}
//记录基准位置
int Partition(SqList &L,int low,int high)
{
	L.elem[0]=L.elem[low];
	int pivotkey=L.elem[low].info;
	while(low<high)
	{
		while(low<high&&L.elem[high].info>=pivotkey)
			high--;
		L.elem[low]=L.elem[high];
		while(low<high&&L.elem[low].info<=pivotkey)
			low++;
		L.elem[high]=L.elem[low];
	}
	L.elem[low]=L.elem[0];
	return low;
}
//快速排序
void QS(SqList &L,int low,int high)
{
	if(low<high)
	{
		int pivotloc=Partition(L,low,high);
		QS(L,low,pivotloc-1);
		QS(L,pivotloc+1,high);
	}
}
void QuickSort(SqList &L)
{
	QS(L,1,L.length);
}
void showmenu()
{
	printf("【1、录入】                                                        *\n");
	printf("【2、移除】                                                        *\n");
	printf("【3、排序】                                                        *\n");
	printf("【0、退出系统】                                                    *\n");
	printf("请选择你所要执行的操作:");
}
void menu()
{
	printf("【1、直插排序】                                                    *\n");
	printf("【2、冒泡排序】                                                    *\n");
	printf("【3、快速排序】                                                    *\n");
	printf("请选择你所要执行的操作:");
}
void menu0()
{
	printf("【1、 高数 】                                                      *\n");
	printf("【2、 英语 】                                                      *\n");
	printf("【3、 物理 】                                                      *\n");
	printf("【4、 离散 】                                                      *\n");
	printf("【5、 数结 】                                                      *\n");
	printf("【6、 学号 】                                                      *\n");
	printf("【7、平均分】                                                      *\n");
	printf("请输入你选择的排序依据:");
}
int main()
{
	SqList L;
	InitList(L);
	int flag,flog,st,no,a=1,b;
	ElemType e;
	ListInsert(L,b,e);
	printf("**********************欢迎进入学生成绩管理系统**********************\n");
	printf("【1、文件读取】                                                    *\n");
	printf("【2、手动输入】                                                    *\n");
	printf("请选择数据导入方式:");
	scanf("%d",&flog);
	while(flog!=0)
	{
		if(flog==1)
		{
			printf("【OK】                                                             *\n");
			enterdata(L);
			flog=0;
		}
		else if(flog==2)
		{
			printf("【OK】                                                             *\n");
			flog=0;
		}
		else printf("输入非法!请输入数字1-2!                                           *\n");
	}
	while(1)
	{
		showmenu();
		scanf("%d",&flag);
		switch(flag)
		{
			case  0:printf("正在退出,请稍后...                                                *");
					system("cls");
					printf("***************************欢迎下次使用*****************************");
					return 0;
			case  1:printf("请输入录入人数:                                                    *\n");
					scanf("%d",&no);
					b=a;
					a+=no;
					printf("请输入该生学号、姓名及各科成绩,以空格相间:                        *\n");
					for(;b<a;b++)
					{
						scanf("%d%s%d%d%d%d%d",&e.key,e.name,e.subject[0],e.subject[1],e.subject[2],e.subject[3],e.subject[4]);
						if(Search_Seq(L,e.key)!=0)
						{
							printf("该学生信息已录入,请勿重复录入!                                  *\n");
							a--;
							b--;
							continue;
						}
						e.totalscore=0;
						for(i=0;i<5;i++)
							e.totalscore+=e.subject[i];
						ListInsert(L,b,e);
					}
					printf("报名成功,为您的爱心点赞!                                          *\n");
					printf("********************************************************************\n");
					break;
			case  2:if(!L.length)
					{
						printf("请在录入后操作!                                                    *\n");
						break;
					}
					printf("请输入您的学号:");
					scanf("%d",&no);
					if(!Search_Seq(L,e.key))
					{
						printf("请在录入后操作!                                                    *\n");
						printf("********************************************************************\n");
						break;
					}
					ListDelete(L,no,e);
					a--;
					printf("已删除该学生成绩信息!                                              *\n");
					printf("********************************************************************\n");
					break;
			case  3:menu();
					scanf("%d",&b);
					menu0();
					scanf("%d",&no);
					if(no>0&&no<6)
					{
						for(st=1;st<=L.length;st++)
							L.elem[st].info=L.elem[st].subject[no-1];
						if(b==1)InsretSort(L);
						else if(b==2)BubbleSort(L);
						else if(b==3)QuickSort(L);
						PrintfSort(L);
					}
					else if(no==6)
					{
						for(st=1;st<=L.length;st++)
							L.elem[st].info=L.elem[st].key;
						if(b==1)InsretSort(L);
						else if(b==2)BubbleSort(L);
						else if(b==3)QuickSort(L);
						PrintfSort(L);
					}
					else if(no==7)
					{
						for(st=1;st<=L.length;st++)
							L.elem[st].info=L.elem[st].totalscore/NUM;
						if(b==1)InsretSort(L);
						else if(b==2)BubbleSort(L);
						else if(b==3)QuickSort(L);
						PrintfSort(L);
					}
					else printf("输入非法!请重新输入.                                               *\n");
					printf("********************************************************************\n");
					break;
			default:printf("输入非法!请输入数字1-5!                                           *\n");
			fflush(stdin);
		}
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值