#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;
}
简单的排序应用代码实现
最新推荐文章于 2024-07-06 11:13:36 发布