數據結構實驗報告——用歸併排序管理學生信息

實驗題目

設計一個排序和查找系統。能夠實現對給定的一組學生的借書證信息(如:卡號、姓名、系別、班號等)進行排序和查找。

 

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

 

發佈了62 篇原創文章 · 獲贊 9 · 訪問量 3180
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章