数据结构实验报告——用归并排序管理学生信息

实验题目

设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxsize 100
typedef struct node {
	char name[maxsize];
	char Student_ID[maxsize];
	char Class[maxsize];
	char Department[maxsize];
} Student_Info;
Student_Info Students[maxsize],temp[maxsize];
void wait_for_Enter() {
	getchar();
	getchar();
}
void copy(Student_Info *a,Student_Info *b) {
	strcpy(a->name , b->name);
	strcpy(a->Student_ID , b->Student_ID);
	strcpy(a->Class , b->Class);
	strcpy(a->Department , b->Department);
}
void merge_sort(int l,int r,int type) {
	if(r-l>=1) {
		int mid=(r+l)/2;
		int i=l,p=l,q=mid+1;
		merge_sort(l,mid,type);
		merge_sort(mid+1,r,type);
		while(p<=mid||q<=r) {
			if(type==1) {
				if(q>r||p<=mid&&strcmp(Students[p].name,Students[q].name)<=0) copy(&temp[i++],&Students[p++]);
				else copy(&temp[i++],&Students[q++]);
			} else if(type==2) {
				if(q>r||p<=mid&&strcmp(Students[p].Student_ID,Students[q].Student_ID)<=0) copy(&temp[i++],&Students[p++]);
				else copy(&temp[i++],&Students[q++]);
			} else if(type==3) {
				if(q>r||p<=mid&&strcmp(Students[p].Class,Students[q].Class)<=0)	copy(&temp[i++],&Students[p++]);
				else copy(&temp[i++],&Students[q++]);

			} else {
				if(q>r||p<=mid&&strcmp(Students[p].Department,Students[q].Department)<=0) copy(&temp[i++],&Students[p++]);
				else copy(&temp[i++],&Students[q++]);
			}
		}
		for(int i=l; i<=r; i++)
			copy(&Students[i],&temp[i]);
	}
}
void Print_Information(int students_num) {
	int i;
	for(i=0; i<students_num; i++) {
		printf("%s %s %s %s\n",Students[i].name,Students[i].Student_ID,Students[i].Class,Students[i].Department);
	}
	printf("打印完成,按回车键退出");
	wait_for_Enter();
}
void Find_Information(int num) {
	int i, op, flag = -1;
	char information[maxsize];
	printf("<1>按姓名查找  <2>按学号查找  <3>按班级查找 <4>按学号查找\n");
	scanf("%d", &op);
	if (op == 1) {
		printf("请输入该生姓名:");
		scanf("%s", information);
		for (i = 0; i < num; i++) {
			if (strcmp(information, Students[i].name) == 0) printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;

		}
	} else if (op == 2) {
		printf("请输入该生学号:");
		scanf("%s", information);
		for (i = 0; i < num; i++) {
			if (strcmp(information, Students[i].Student_ID) == 0) printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;
		}
	} else if(op ==3) {
		printf("请输入考勤班级:");
		scanf("%s", information);
		for (i = 0; i < num; i++) {
			if (strcmp(information, Students[i].Class) == 0) 	printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;
		}
	} else {
		printf("请输入院系:");
		scanf("%s", information);
		for (i = 0; i < num; i++) {
			if (strcmp(information, Students[i].Department) == 0) printf("%s %s %s %s\n", Students[i].name, Students[i].Student_ID, Students[i].Class, Students[i].Department), flag = 1;
		}
		if (flag == -1) printf("不存在此信息!\n");
	}
	printf("查找完成,按回车键退出");
	wait_for_Enter();
}
void Information_Sort(int num) {
	int type;
	printf("<1>按姓名排序");
	printf("<2>按学号排序");
	printf("<3>按班级排序");
	printf("<4>按院系排序");
	scanf("%d",&type);
	merge_sort(0,num-1,type);
	printf("排序完成,按回车键退出");
	wait_for_Enter();
}
int main() {
	int i,j,n,op,type;
	printf("请输入学生人数\n");
	scanf("%d",&n);
	printf("请输入每个学生的姓名,学号,班级,院系:\n");
	for(i=0; i<n; i++) {
		scanf("%s%s%s%s",Students[i].name,Students[i].Student_ID,Students[i].Class,Students[i].Department);
	}
	while(1) {
		printf("请输入:\n");
		printf("<1>查找某位同学 <2>对指定信息进行排序 <3>打印输出所有学生的信息\n");
		scanf("%d",&op);
		if(op==1) {
			Find_Information(n);
		} else if(op==2) {
			Information_Sort(n);
		} else {
			Print_Information(n);
		}
		system("cls");
	}
	return 0;
}

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值