学生管理系统(改进版)(C语言链表)

在这里插入图片描述

main.c文件

/*·1. 界面
	2. 数据结构的设计
			//需求和数据结构设计糅合在一起 
	3. 交互				*/

#include "Mylist.h" 

void menu();/*数据的设计----->学生信息抽象出来,菜单设计*/

struct Node *list;	

void keyDown();/*用户的交互:根据所选菜单项,执行问题*/

int main(int argc, char *argv[]) {
	list = createList();
	readInfoFromFile(list, "1.txt");
	while(1){
		menu(); 
		keyDown();
		system("pause");
		system("cls");
	}

//	测试链表代码
//	struct Node*list = creatList();
//	insertNodeByHead(list, 1); 
//	insertNodeByHead(list, 3); 
//	insertNodeByHead(list, 2); 
//	insertNodeByHead(list, 4);
//	printList(list);
//	printf("删除指定位置:\n");
//	deleteAppoinNode(list, 3);
//	printList(list);
//	printf("链表的查找:\n");
//	printf("%d\n", searchInfoByData(list, 2)->data); 
	system("pause");
	return 0;
}

void menu()
{
	/*所有操作都同步到文件*/ 
	printf("--------------【学生管理系统】-----------------\n");
	printf("\t\t0. 退出系统\n");	
	printf("\t\t1. 录入信息\n");
	printf("\t\t2. 插入信息\n");
	printf("\t\t3. 浏览信息\n");
	printf("\t\t4. 按学号浏览信息\n");
	printf("\t\t5. 修改信息\n");
	printf("\t\t6. 删除信息\n");
	printf("\t\t7. 查找信息\n");
	printf("\t\t8. 成绩排序\n");
	printf("\t\t9. 成绩统计\n");
	printf("-----------------------------------------------\n");	
}


void keyDown()
{
	int choice = 0;
	struct student data;
	struct Node *pMove = NULL;
	scanf("%d", &choice);
	switch(choice){
		case 0:
			printf("正常退出\n");
			system("pause");
			exit(0); 
				break;
		case 1:
			printf("----------------【录入信息】----------------\n"); 
			/*插入链表*/ 
			printf("请输入学生学号,姓名,成绩:");
			fflush(stdin);/*清空缓冲区*/ 
			scanf("%s%s%d",data.xuehao, data.name, &data.score ) ; 
			insertNodeByHead(list, data);
			break;
		case 2:
			printf("----------------【插入信息】-------------------\n"); 
			printf("请输入插入学生学号,姓名,成绩:");
			fflush(stdin);/*清空缓冲区*/ 
			scanf("%s%s%d",data.xuehao, data.name, &data.score );
			printf("插在学号为多少的后面");
			char xuehao1[20];
			fflush(stdin);/*清空缓冲区*/ 
			scanf("%s", xuehao1) ;
			insert(list, data, xuehao1);
			break; 
		case 3:
			printf("----------------【浏览信息】-------------------\n"); 
			printList(list);/*打印链表*/ 
			break;
		case 4:
			printf("----------------【按学号浏览信息】-------------------\n"); 
			sort_score(list);/* 打开可按学号排序 */
			printList(list);/*打印链表*/ 
			break;
		case 5:
			printf("----------------【修改信息】-------------------\n");
			printf("请输入需要修改的学生姓名:");
			scanf("%s", data.name);
			modification(list, data.name);
			break;
		case 6:
			printf("----------------【删除信息】-------------------\n");
			printf("请输入删除的学生姓名:");
			scanf("%s", data.name);
			deleteAppoinNode(list, data.name); 			
			break;
		case 7:
			printf("----------------【查找信息】-------------------\n");
			printf("请输入要查找学生的学号:");
			scanf("%s", data.xuehao);
			pMove = searchInfoByData(list, data.xuehao);
			if((pMove) == NULL){
				printf("未找到相关信息!\n");
				system("pause");
			} 
			else{
				printf("学号\t姓名\t成绩\n");
				printf("%s\t%s\t%d\n", pMove->data.xuehao, pMove->data.name,  pMove->data.score );
			}
			break;
		case 8:
		    printf("----------------【成绩排序】-------------------\n");
		    sort(list);
			printList(list);/*打印链表*/ 
			break; 
		case 9:
		    printf("----------------【成绩统计】-------------------\n");
	 		count(list);
			break; 
		default:
			printf("选择错误,重新输入\n");
			system("pause");/*防止闪屏*/ 
			break;
	} 
	writeInfoToFile(list, "1.txt");
}


Mylist.h文件

#include <stdio.h>
#include <stdlib.h>		/*防止闪屏*/
#include <string.h>

struct student{
	char xuehao[20];
	char name[50];
	int score;
};

//结构分结构去写
//某一种数据结构趋势线什么东西的时候,单独去写这一种数据结构
//先把数据写对了再说

struct Node{
	/*int data*/
	struct student data;
	struct Node*next;
};


/*创建表*/ 
struct Node *createList(){
	/*用结构体变量表示表头*/ 
	/*指针--->变量  动态内存申请*/ 
	struct Node *headNode = (struct Node *)malloc(sizeof(struct Node));
	/*表头:做差异化处理  数据域data 不做初始化*/ 
	headNode->next = NULL;

	return headNode;
} 

/*创建节点*/ 
struct Node* createNode(struct student data){
	struct Node*newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;
	return newNode; 		
} 

/*插入节点*/
void insertNodeByHead(struct Node*headNode, struct student data){
	struct Node*newNode = createNode(data);
	/*表头法插入*/
	newNode->next = headNode->next;
	headNode->next = newNode; 
} 

/*删除链表*/
void deleteAppoinNode(struct Node*headNode,  char*name){
	//struct student 
	struct Node*posNode = headNode->next;
	struct Node*posFrontNode = headNode;
	if(posNode == NULL){
		printf("数据为空,无法删除!\n");
		return;
	}
	/*姓名是字符串,字符串:strcmp */ 
	while(strcmp(posNode->data.name, name)){
		posFrontNode = posNode;
		posNode = posFrontNode->next;
		if(posNode ==NULL){
			printf("未找到指定位置无法删除!\n");
			return ;
		}
	}
	/*找到了*/
	posFrontNode->next = posNode->next;
	free(posNode);
} 

/*链表的存储:文件读操作*/
void readInfoFromFile(struct Node*headNode, char *fileName){
	/* 1. 打开*/ 
	FILE *fp;
	struct student data;/*先把文件读到data中去,在读到链表中去*/ 
	fp = fopen(fileName, "r");/*这个方式是不会创造文件的*/ 
	if(fp == NULL){
		fp = fopen(fileName, "w+");/*这个方式能创造文件的*/
	}
	/*2. 读文件*/
	/*先把文件读到data中去,在读到链表中去*/
		/*将文件当作输入设备*/ 
	while(fscanf(fp, "%s\t%s\t%d\n", data.xuehao, data.name, &data.score) != EOF){
						/*制表符\t*/       /*在读到链表里去*/ 
		insertNodeByHead(headNode, data);	
	} 
	/* 3.关闭文件*/
	fclose(fp); 
} 

/*链表的读取:文件写操作*/
void writeInfoToFile(struct Node*headNode, char*fileName){
	FILE *fp;
	fp = fopen(fileName, "w");/*已清空的方式*/ /*w+是追加的方式*/ 
	if(fp == NULL){
		printf("文件打开失败!");
		return ; 
	}
	struct Node *pMove = headNode->next;
	while(pMove){
		fprintf(fp, "%s\t%s\t%d\n",pMove->data.xuehao,  pMove->data.name, pMove->data.score);
		pMove = pMove->next;
	}
	fclose(fp);
}
/*修改功能*/ 	/*方法一*/ 
struct Node *modification (struct Node* headNode, char* name){
	struct student data;
	deleteAppoinNode(headNode, name);
	printf("请重新输入学生学号,姓名,成绩::");
	fflush(stdin);/*清空缓冲区*/ 
	scanf("%s%s%d",data.xuehao, data.name, &data.score) ; 
	insertNodeByHead(headNode, data); 
}
 

//查找 
struct Node *searchInfoByData(struct Node* headNode, char *xuehao){
	struct Node *pMove = headNode->next;
	while(strcmp(pMove->data.xuehao, xuehao)){
		pMove = pMove->next;
		if(pMove == NULL){
			return NULL;
		}
	}
	return pMove;
} 

//插入到某人后面
void insert(struct Node*headNode, struct student data, char *xuehao) {
	struct Node*newNode = createNode(data);
	struct Node *pMove = searchInfoByData(headNode, xuehao);
	newNode->next = pMove->next;
	pMove->next = newNode;
}

//排序(辅) 
void exchange(struct Node*now, struct Node*stop){
		struct Node*temp = (struct Node*)malloc(sizeof(struct Node));
		
		strcpy(temp->data.xuehao, stop->data.xuehao);			
		strcpy(temp->data.name, stop->data.name);
		temp->data.score        = stop->data.score;
		
		strcpy(stop->data.xuehao, now->data.xuehao);		
		strcpy(stop->data.name, now->data.name);
		stop->data.score    	= now->data.score;

		strcpy(now->data.xuehao , temp->data.xuehao);
		strcpy(now->data.name , temp->data.name);
		now->data.score    		= temp->data.score; 

		free(temp);		
}

//排序成绩(主) 
void sort(struct Node*headNode){
	struct Node*now = headNode->next->next;
	struct Node*stop = headNode->next;
	while(stop->next){
		now = stop->next;
		while(now){
			if(stop->data.score < now->data.score){
				exchange(now, stop);
			}
			now = now->next;  
		}
		stop = stop->next;
	}	 
}
//排序学号
void sort_score(struct Node*headNode){
	struct Node*now = headNode->next->next;
	struct Node*stop = headNode->next;
	while(stop->next){
		now = stop->next;
		while(now){
			long a = atol(stop->data.xuehao);
			long b = atol(now->data.xuehao);
			if(a > b){
				exchange(now, stop);
			}
			now = now->next;  
		}
		stop = stop->next;
	}	 
}

//成绩计数
int *count(struct Node*headNode){
	struct Node*now = headNode->next;
	sort(headNode);
	int score[5]={0};
	while( now ) {
		if(now->data.score >= 90){
			score[0]++;
		}else if(now->data.score < 90 && now->data.score >= 80){
			score[1]++;
		}else if(now->data.score < 80 && now->data.score >=70){
			score[2]++;
		}else if(now->data.score < 70 && now->data.score >=60){
			score[3]++;
		}else if(now->data.score < 60){
			score[4]++;
		}
		now = now->next;
	}
	printf("优秀:  %d人\n", score[0]);
	printf("良好:  %d人\n", score[1]);
	printf("中等:  %d人\n", score[2]);
	printf("及格:  %d人\n", score[3]);
	printf("不及格:%d人\n", score[4]);
} 

/*打印链表*/
void printList(struct Node*headNode){
	struct Node*pMove = headNode->next;
	/*设计到数据的处理*/ 
	printf("学号\t姓名\t成绩\n");
	while(pMove){
		printf("%s\t%s\t%d\n", pMove->data.xuehao, pMove->data.name,  pMove->data.score );
		pMove = pMove->next;
	}
	printf("\n");
} 

猜你喜欢

转载自blog.csdn.net/weixin_45773503/article/details/106481849