学生管理系统——快速排序、折半查找等

#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;
}

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 16
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值