学生信息管理系统的C语言链表实现

功能有增删查改,排序,输出



#include<stdio.h>
#include<math.h>
#include<string.h> 
#include<stdlib.h>
#define mian main
const int N = 1e5 + 5;
typedef struct stu {
	char no[20], name[20];//学号,姓名
	int Chinese, English, Math, C, Java;//几科的成绩
	int totalScore;//总成绩
	double avgScore;//平均成绩
	struct stu* next;
}Node;
typedef struct _list {
	Node* head;
	Node* tail;
}List;
void swap_int(int *a,int *b)//交换两个int变量的函数 
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void addStudent(List* pList) {//添加学生数据 
	Node *p = (Node*)malloc(sizeof(Node));
	scanf("%s%s", &p->no, &p->name);
	scanf("%d%d%d%d%d", &p->Chinese, &p->English, &p->Math, &p->C, &p->Java);
	p->totalScore = p->Chinese + p->English + p->Math + p->C + p->Java;
	p->avgScore = p->totalScore / 5.0;
	p->next = NULL;
	Node* last = pList->tail;
	if (last) {
		pList->tail->next = p;
		pList->tail = p;
	}else {
		pList->head = p;
		pList->tail = p;
	}
}
void printStudent(List* pList) {//输出学生信息 
	Node *p = pList->head;
	printf("*---------------------------------------------------------------------------------------*\n");
	printf("|学号          |姓名     |语文    |数学    |英语    |C       |Java    |总成绩  |平均成绩|\n");
	while (p != NULL) {
		printf("*---------------------------------------------------------------------------------------*\n");
		printf("|%-14s|%-9s|", p->no, p->name);
		printf("%-8d|%-8d|%-8d|%-8d|%-8d|%-8d|%-8.2f|\n", p->Chinese, p->English, p->Math, p->C, p->Java, p->totalScore, p->avgScore);
		p = p->next;
	}
	printf("*---------------------------------------------------------------------------------------*\n");
}
void changeStudent(List* pList) {//依据学号修改学生信息 
	int flag = 0;
	char x[20];
	printf("请输入要修改的学生学号\n");
	scanf("%s", x);
	Node* p = pList->head;
	while (p != NULL) {
		if (!strcmp(p->no, x)) {
			printf("请输修改后的学生信息\n");
			printf("依次输入学号,姓名,语文成绩,数学成绩,英语成绩,C语言成绩,Java语言成绩,用空格隔开。其他数据我将帮您自动完成\n");
			scanf("%s%s", p->no, p->name);
			scanf("%d%d%d%d%d", &p->Chinese, &p->English, &p->Math, &p->C, &p->Java);
			p->totalScore = p->Chinese + p->English + p->Math + p->C + p->Java;
			p->avgScore = p->totalScore / 5.0;
			flag = 1;
			break;
		}
		p = p->next; 
	}
	if (flag) printf("修改成功!\n");
	else printf("修改失败!找不到该学号的学生\n");
}
void sortStudent(List* pList){//依据不同依据排序 
	int op = 0, len = 0; 
	printf("请输入排序依据!\n");
	printf("1.按总成绩升序\n");
	printf("2.按总成绩降序\n");
	printf("3.按姓名排序\n");
	scanf("%d", &op);
	Node* p = pList->head;
	while(p){
		len++;
		p = p->next;
	}
	for(int i = 0; i < len - 1; i++){
		p = pList->head;
		for(int j = 0; j < len - i - 1; j++){
			if((op == 1 && p->totalScore > p->next->totalScore) || (op == 2 && p->totalScore < p->next->totalScore) || (op == 3 && strcmp(p->name, p->next->name) > 0)){
				char t[20];
				strcpy(t, p->no);
				strcpy(p->no, p->next->no);
				strcpy(p->next->no, t);
				strcpy(t, p->name);
				strcpy(p->name, p->next->name);
				strcpy(p->next->name, t);
				swap_int(&p->Chinese, &p->next->Chinese);
				swap_int(&p->Math, &p->next->Math);
				swap_int(&p->English, &p->next->English);
				swap_int(&p->C, &p->next->C);
				swap_int(&p->Java, &p->next->Java);
				swap_int(&p->totalScore, &p->next->totalScore);
				double temp = p->avgScore;
				p->avgScore = p->next->avgScore;
				p->next->avgScore = temp;
			}
			p = p->next;
		}
	}
	printf("排序完成!\n");
}
void searchStudent(List *pList){//依据学号查找学生信息 
	int flag = 0;
	char x[20];
	printf("请输入要查找的学生学号\n");
	scanf("%s", x);
	Node* p = pList->head;
	while (p != NULL) {
		if (!strcmp(p->no, x)) {
			printf("找到了!该学生信息为:\n");
			printf("*---------------------------------------------------------------------------------------*\n");
			printf("|学号          |姓名     |语文    |数学    |英语    |C       |Java    |总成绩  |平均成绩|\n");
			printf("*---------------------------------------------------------------------------------------*\n");
			printf("|%-14s|%-9s|", p->no, p->name);
			printf("%-8d|%-8d|%-8d|%-8d|%-8d|%-8d|%-8.2f|\n", p->Chinese, p->English, p->Math, p->C, p->Java, p->totalScore, p->avgScore);
			printf("*---------------------------------------------------------------------------------------*\n");
			flag = 1;
			break;
		}
		p = p->next; 
	}
	if (!flag) printf("失败了!找不到该学号的学生\n");
}
void deleteStudent(List* pList) {//依据学号删除指定学生信息 
	int flag = 0;
	char na[20];
	printf("请输入要删除的学生的学号!\n");
	scanf("%s", na);
	Node *p  = pList->head, *temp = NULL, *prev = NULL; 
	while (p != NULL) {
		if (!strcmp(p->no, na)) {
			if(p == pList->head){
				free(pList->head);
				pList->head = p->next;
			}else{
				if(p == pList->tail) pList->tail = prev; 
				temp = p;
				p = p->next;
				prev->next = p;
				free(temp);
			}
			flag = 1;
			break;
		}
		prev = p;
		p = p->next;
	}
	if (flag) printf("删除成功!\n");
	else printf("删除失败!找不到该学号的学生\n");
} 
int main() {
	List list;
	list.head = list.tail = NULL;
	int order = 0;
	printf("*----------------------------------------------------------------*\n");
	printf("|                                                                |\n");
	printf("|     欢迎使用学生信息管理系统!请输入您想要进行的操作的指令     |\n");
	printf("|                                                                |\n");
	printf("*----------------------------------------------------------------*\n");
	printf("|       1.添加学生信息           |       2.修改学生信息          |\n");
	printf("*----------------------------------------------------------------*\n");
	printf("|            3.排序              |         4.查找学生            |\n");
	printf("*----------------------------------------------------------------*\n");
	printf("|         5.删除学生             |      6.查看所有学生信息       |\n");
	printf("*----------------------------------------------------------------*\n");
	printf("|                         0.退出管理程序                         |\n");
	printf("*----------------------------------------------------------------*\n");
	printf("                                               ~☆made by moWhite\n");
	while (1) {
		printf("请输入操作指令!\n");
		scanf("%d", &order);
		switch (order) {
			case 0:{
				printf("系统已退出,欢迎下次使用!\n");
				exit(0);
			}
			case 1: {
				int cnt = 0;
				printf("请输入要添加的学生数量\n");
				scanf("%d", &cnt);
				printf("请输入学生信息\n");
				printf("依次输入学号,姓名,语文成绩,数学成绩,英语成绩,C语言成绩,Java语言成绩,用空格隔开。其他数据我将帮您自动完成\n");
				while (cnt--) addStudent(&list);
				printf("添加完成!\n"); 
				break;
			}
			case 2: {
				changeStudent(&list);
				break;
			}
			case 3: {
				sortStudent(&list);
				break;
			}
			case 4: {
				searchStudent(&list);
				break;
			}
			case 5: {
				deleteStudent(&list);
				break;
			}
			case 6: {
				printStudent(&list);
				break;
			} 
		}
		printf("\n"); 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值