#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef struct
{
int stuID; //学生编号
char stuName[20]; //学生名称
int stuScore; //学生成绩
} Book;
typedef Book DataType;
typedef struct
{
DataType *elem; //存储空间的基地址
int length; //长度
} BookList;
//初始化顺序表
Status InitList(BookList *L)
{
//构造一个空的顺序表L
L->elem=(DataType *)malloc(sizeof(DataType)*MAXSIZE);
L->length=0;
return OK;
}
//输入学生信息
void InputList(DataType *e){
printf("请输入学生编号:\n");
scanf("%d",&e->stuID);
printf("请输入学生名称:\n");
scanf("%s",&e->stuName);
printf("请输入学生成绩:\n");
scanf("%d",&e->stuScore);
}
//输出学生信息
void OutputList(DataType *e)
{
printf(" %d %s %d \n", e->stuID, e->stuName, e->stuScore);
}
//新增学生信息
int InsertList(BookList *L,int i,DataType e){
int j;
if(i<1||i>L->length){
printf("插入位置不合法\n");
return -1;
}else if(L->length>=MAXSIZE){
printf("顺序表已满,不能插入元素\n");
return 0;
}else{
for(j=L->length;j>=i;j--){
L->elem[j]=L->elem[j-1];
}
L->elem[i-1]=e;
L->length=L->length+1;
}
return 1;
}
//删除学生信息
int DeleteList(BookList *L,int i,DataType *e){
int j;
if(L->length<=0){
printf("顺序表已空不能进行删除\n");
return 0;
}else if(i<1||i>L->length){
printf("顺序表删除位置不合适\n");
return -1;
}else{
*e=L->elem[i-1];
for(j=i;j<L->length;j++){
L->elem[j-1]=L->elem[j];
}
L->length=L->length-1;
printf("删除数据:\n");
printf(" %d %s %d\n", e->stuID, e->stuName, e->stuScore);
}
return 1;
}
//修改学生信息
int UpdateList(BookList *L,int i,DataType e){
int j;
if(L->length<=0){
printf("顺序表已空不能进行修改\n");
return 0;
}else if(i<1||i>L->length){
printf("顺序表修改位置不合适\n");
return -1;
}else{
L->elem[i-1]=e;
}
return 1;
}
//按序号查询学生信息
int GetList(BookList *L,int i,DataType *e){
if(i<1||i>L->length){
return -1;
}
*e=L->elem[i-1];
printf("按序号查询数据:\n");
printf(" %d %s %d \n", e->stuID, e->stuName, e->stuScore);
return 1;
}
//按学生名称查询学生信息
int LocationList(BookList *L,DataType e){
int i;
for(i=0;i<L->length;i++){
//!strcmp(bl->elem[i].name,e.name)
if(!strcmp(L->elem[i].stuName,e.stuName))
{
printf("按内容查询数据 :\n");
printf(" %d %s %d\n", L->elem[i].stuID, L->elem[i].stuName, L->elem[i].stuScore);
return 1;
}
}
return 0;
}
//利用直接插入排序或者折半插入排序按照姓名进行排序;
void InsertSort(BookList *L){
int i,j;
DataType t;
for(i=1;i<L->length;i++){
t=L->elem[i];
j=i;
while(j>=0&&t.stuID<L->elem[j-1].stuID){
L->elem[j]=L->elem[j-1];
j--;
}
printf("%d \n",t.stuID);
L->elem[j]=t;
}
}
//(7)利用快速排序和堆排序按照学号进行排序;
int Partition(BookList *L,int low, int high)
{
DataType t;
int pivotkey;
pivotkey=L->elem[low-1].stuID;
t=L->elem[low-1];
while(low<high)
{
while(low<high&&L->elem[high-1].stuID>=pivotkey)
{
high--;
}
if(low<high)
{
L->elem[low-1]=L->elem[high-1];
low++;
}
while(low<high&&L->elem[low-1].stuID<=pivotkey)
{
low++;
}
if(low<high)
{
L->elem[high-1]=L->elem[low-1];
high--;
}
L->elem[low-1]=t;
}
return low;
}
void QuickSoet(BookList *L,int low,int high){
int pivot;
if(low<high){
pivot=Partition(L,low,high);
QuickSoet(L,low,pivot-1);
QuickSoet(L,pivot+1,high);
}
}
//统计表中学生个数
int selectSort(BookList *L) {
printf("请输入统计表中学生个数:%d \n",L->length);
}
//折半查找
int BinarySearch(BookList S)
/*在有序顺序表中这半查找关键字为x的元素,如果找到则返回该元素在表中的位置,否折返回0*/
{
int low,high,mid,i;
low=0,high=S.length-1; /*设置待查找元素范围的下界和上界*/
DataType x,e;
printf("按学生名称查找\n");
scanf("%s",&e.stuName);
for(i=0;i<S.length;i++){
//!strcmp(bl->elem[i].name,e.name)
if(!strcmp(S.elem[i].stuName,e.stuName))
{
x.stuID=S.elem[i].stuID;
}
}
while(low<=high)
{
mid=(low+high)/2;
if(S.elem[mid].stuID==x.stuID) /*如果找到元素,则返回该元素所在的位置*/
{
printf("学号:%d \n成绩:%d \n",S.elem[mid].stuID, S.elem[mid].stuScore);
return mid+1;
}
else if(S.elem[mid].stuID<x.stuID) /*如果mid所指示的元素小于关键字,则修改low指针*/
low=mid+1;
else if(S.elem[mid].stuID>x.stuID) /*如果mid所指示的元素大于关键字,则修改high指针*/
high=mid-1;
}
return 0;
}
int BinarySearch1(BookList S)
/*在有序顺序表中这半查找关键字为x的元素,如果找到则返回该元素在表中的位置,否折返回0*/
{
int low,high,mid,i;
low=0,high=S.length-1; /*设置待查找元素范围的下界和上界*/
DataType x;
printf("按学生学号查找\n");
scanf("%d",&x.stuID);
while(low<=high)
{
mid=(low+high)/2;
if(S.elem[mid].stuID==x.stuID) /*如果找到元素,则返回该元素所在的位置*/
{
printf("姓名:%s \n成绩:%d \n ",S.elem[mid].stuName, S.elem[mid].stuScore);
return mid+1;
}
else if(S.elem[mid].stuID<x.stuID) /*如果mid所指示的元素小于关键字,则修改low指针*/
low=mid+1;
else if(S.elem[mid].stuID>x.stuID) /*如果mid所指示的元素大于关键字,则修改high指针*/
high=mid-1;
}
return 0;
}
//main主运行函数
int main(){
BookList L;
int n,num,i,flag=0,nums;
DataType e;
do{
printf("********************************************\n");
printf("* 1.创建学生信息表 *\n");
printf("* 2.输入学生信息表 *\n");
printf("* 3.输出学生信息表 *\n");
printf("* 4.增加学生信息表 *\n");
printf("* 5.删除学生信息表 *\n");
printf("* 6.修改学生信息表 *\n");
printf("* 7.查找学生信息表 *\n");
printf("* 8.统计学生信息表 *\n");
printf("* 9.学号进行排序 *\n");
printf("* 10.学号快速排序 *\n");
printf("* 11.姓名折半查找 *\n");
printf("* 12.学号折半查找 *\n");
printf("* 0.退出系统 *\n");
printf("********************************************\n");
printf("请根据提示操作!\n");
scanf("%d",&n);
switch(n){
case 1:
if(InitList(&L))
printf("成功建立顺序表\n\n");
else
printf("顺序表建立失败\n\n");
break;
case 2:
printf("请输入学生的数量<100: \n");
scanf("%d",&num);
if(num>100){
printf("===============请按照要求输入=============\n");
}else{
for(int i=0;i<num;i++){
printf("第%d种数据:\n",i+1);
InputList(&L.elem[i]);//L.elem[i]是DataType
}
L.length=num;
}
break;
case 3:
printf("当前学生总数为:%d\n",L.length);
printf("当前顺序表为:\n");
printf("学生编号 学生名称 学生成绩\n");
for(i=0; i<L.length; i++){
OutputList(&L.elem[i]);
}
printf("\n");
break;
case 4:
printf("请输入新增学生的位置:\n");
scanf("%d",&num);
printf("请输入要新增的学生信息:\n");
printf("请输入学生编号:\n");
scanf("%d",&e.stuID);
printf("请输入学生名称:\n");
scanf("%s",&e.stuName);
printf("请输入学生成绩:\n");
scanf("%d",&e.stuScore);
if(InsertList(&L,num,e)){
printf("新增数据成功\n");
}else{
printf("新增数据失败\n");
}
break;
case 5:
printf("请输入删除学生的位置:\n");
scanf("%d",&num);
if(DeleteList(&L,num,&e)){
printf("删除数据成功\n");
}else{
printf("删除数据失败\n");
}
break;
case 6:
//修改学生信息
printf("请输入修改学生的位置:\n");
scanf("%d",&num);
printf("请输入要修改的学生信息:\n");
printf("请输入学生编号:\n");
scanf("%d",&e.stuID);
printf("请输入学生名称:\n");
scanf("%s",&e.stuName);
printf("请输入学生成绩:\n");
scanf("%d",&e.stuScore);
if(UpdateList(&L,num,e)){
printf("修改数据成功\n");
}else{
printf("修改数据失败\n");
}
break;
case 7:
printf("==========请输入查询学生信息的类型==========\n");
printf("1.按位置编号查找\n");
printf("2.按学生名称查找\n");
scanf("%d",&num);
if(num==1){
printf("输入查询位置编号:\n");
scanf("%d",&nums);
if(GetList(&L,nums,&e)){
printf("查询数据成功\n");
}else{
printf("查询数据失败\n");
}
}else if(num==2){
printf("输入查询学生名称:\n");
scanf("%s",&e.stuName);
if(LocationList(&L,e)){
printf("查询数据成功\n");
}else{
printf("查询数据失败\n");
}
}else{
printf("请输入正确的编号\n");
}
break;
case 8:
selectSort(&L);
break;
case 9:
InsertSort(&L);
break;
case 10:
QuickSoet(&L,1, L.length);
break;
case 11:
BinarySearch(L);
break;
case 12:
BinarySearch1(L);
break;
case 0:
flag=1;
printf("你已退出了此系统\n");
break;
default:
printf("请输入正确的数字\n");
break;
}
}while(flag!=1);
return 0;
}