學生管理系統(改進版)(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");
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章