完整代码
#include<iostream>
#include <stdio.h>
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int Status;
using namespace std;
typedef struct
{char xm[30];
int xh;
int CLanguage_P;//C语言程序设计
int Discrete_M; //离散数学
int sum; //总分
}ElemType;
typedef struct
{ ElemType *R; //表基址
int length; //表长
}SSTable;
//1.输入数据创建顺序表
int Insert_SSTable(SSTable &ST,int j)
{int i;
ST.R=new ElemType[MAXSIZE];
ST.length=0;//空出ST.R[0]的位置
for(int i=1;i<=j;i++)
{printf("第%d个学生 ",i);
scanf("%s %d %d %d",ST.R[i].xm,&ST.R[i].xh,
&ST.R[i].CLanguage_P,&ST.R[i].Discrete_M);
ST.R[i].sum=ST.R[i].CLanguage_P+ST.R[i].Discrete_M,
ST.length++;
}
return OK;
}
// 2.在表中插入记录
Status ListInsert_SST(SSTable &ST,int i,ElemType st)
{//在顺序表ST的第i个位置之前插入新的数据元素st,
//i的合法值为,1≤i≤ST.length+1
int j;
if(i<1||i>ST.length+1) return ERROR;
if(ST.length==MAXSIZE-1) return ERROR;
//当前存储空间已满
//下标表示法实现元素移动和插入st
for(j=ST.length;j>=i;j--)
ST.R[j+1]=ST.R[j];//元素后移
ST.R[i]=st;
ST.length++;//表长加1
return OK;
}
//3.按学号为关键字直接插入排序
int InsertSort(SSTable &ST)
{ int i,j;
for(i=2;i<=ST.length;++i)
if( ST.R[i].xh<ST.R[i-1].xh)
{ST.R[0]=ST.R[i];
ST.R[i]=ST.R[i-1];
for(j=i-2; ST.R[0].xh<ST.R[j].xh;--j)
ST.R[j+1]=ST.R[j];
ST.R[j+1]=ST.R[0];
}
return OK;
}
//4.以总成绩为关键字冒泡排序
int BubbleSort(SSTable &ST)
{ int m,i,j,flag=1;
ElemType x;
m=ST.length-1;
while((m>0)&&(flag==1))
{ flag=0;
for(j=1;j<=m;j++)
if(ST.R[j].sum>ST.R[j+1].sum)
{flag=1;
x=ST.R[j];ST.R[j]=ST.R[j+1]; ST.R[j+1]=x;
} //endif
m--;
} //endwhile
return OK;
}
//5.以C语言成绩为关键字简单选择排序
int SelectSort(SSTable &ST)
{int i,j,k;
ElemType t;
for(i=1;i<ST.length; ++i)
{k=i;
for(j=i+1;j<=ST.length;j++)
if(ST.R[j].CLanguage_P<ST.R[k].CLanguage_P)
k=j;
if(k!=i)
{t=ST.R[i];ST.R[i]=ST.R[k];ST.R[k]=t;}
}
return OK;
}
//6.以离散数学成绩为关键字折半插入排序
int BInsertSort(SSTable &ST)
{ int i,j,low,high,m;
for (i=2;i<=ST.length;++i )
{ ST.R[0]=ST.R[i];low=1;high=i-1 ;
while(low<=high)
{ m=(low+high)/2 ;
if(ST.R[0].Discrete_M<ST.R[m].Discrete_M) high=m-1;
else low=m+1;
}
for (j=i-1;j>=high+1;--j) ST.R[j+1]=ST.R[j];
ST.R[high+1]=ST.R[0];
}
return OK;
} // BInsertSort
//7.以姓名为关键字快速排序
int QKpass( SSTable &ST,int low,int high )
{ ST.R[0] = ST.R[low];
while ( low < high )
{ { while(low<high&&strcmp(ST.R[high].xm, ST.R[0].xm)>0 )--high;
ST.R[low] =ST.R[high];
while(low<high&&strcmp(ST.R[high].xm, ST.R[0].xm)<0)++low;
ST.R[high]=ST.R[low];
}
ST.R[high] = ST.R[low];
}
ST.R[low]=ST.R[0];
return low;
}
void QKSort( SSTable &ST,int low, int high )
{ int pos;
if ( low < high )
{ pos= QKpass (ST, low, high ) ;
QKpass(ST, low, pos-1) ;
QKpass(ST, pos+1, high ) ;
}
}
//8.显示表中数据记录
int show(SSTable &ST)
{int i;
printf(" 姓名 学号 C语言 离散 总分\n");
for(i=1;i<=ST.length;i++)
{printf("第%2d名学生:",i);
printf("%s %d %d %d %d\n",ST.R[i].xm,ST.R[i].xh,
ST.R[i].CLanguage_P,ST.R[i].Discrete_M,ST.R[i].sum);
}
return OK ;
}
//主程序代码:
int main()
{ int i,j,h,choose;
ElemType st;
SSTable ST;
printf("实验4:排序的基本操作\n");
printf("完成人:\n");printf("完成日期:\n");
printf("-----------------程序菜单------------------------\n");
printf("1.输入数据创建顺序表 2.在表中插入记录\n");
printf("3.按学号直接插入排序 4.按总分冒泡排序\n");
printf("5.按C成绩简单选择排序 6.按离散成绩折半插入排序\n");
printf("7.按姓名快速排序 8.输出表中数据记录\n");
printf(" --------------------0.退出----------------------\n");
choose = -1;
while (choose!= 0) {
printf("请选择:");
scanf("%d",&choose);
switch (choose) {
case 1: //输入数据创建顺序表
printf("输入学生人数:"); scanf("%d",&j);
printf("依次输入 姓名 学号 C语言 离散:\n");
Insert_SSTable(ST,j);
break;
case 2: //在表中插入数据记录
printf("输入插入位置i值及姓名 学号 C语言 离散:\n");
scanf("%d %s %d %d %d",&i,st.xm,&st.xh,
&st.CLanguage_P,&st.Discrete_M);
st.sum=st.CLanguage_P+st.Discrete_M;
printf("完成插入数据记录\n");
ListInsert_SST(ST,i,st);
break;
case 3://按学号直接插入排序(算法8.1)
InsertSort(ST);
printf("完成按学号直接插入排序\n");
break;
case 4: //按总分冒泡排序
BubbleSort(ST);
printf("完成按总分冒泡排序\n");
break;
case 5: //按C语言成绩简单插入选择排序
SelectSort(ST);
printf("完成按C语言成绩简单选择排序\n");
break;
case 6: //按离散数学成绩折半插入排序
BInsertSort(ST);
printf("完成按离散数学成绩折半插入排序\n");
break;
case 7: //按姓名快速快速排序
QKSort(ST,1,ST.length) ;
printf("完成按姓名快速排序\n");
break;
case 8: //输出顺序表的数据记录
show(ST);
break;
}
}
return 0;
}