main.c文件
#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");
}
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{
struct student data;
struct Node*next;
};
struct Node *createList(){
struct Node *headNode = (struct Node *)malloc(sizeof(struct Node));
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 Node*posNode = headNode->next;
struct Node*posFrontNode = headNode;
if(posNode == NULL){
printf("数据为空,无法删除!\n");
return;
}
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){
FILE *fp;
struct student data;
fp = fopen(fileName, "r");
if(fp == NULL){
fp = fopen(fileName, "w+");
}
while(fscanf(fp, "%s\t%s\t%d\n", data.xuehao, data.name, &data.score) != EOF){
insertNodeByHead(headNode, data);
}
fclose(fp);
}
void writeInfoToFile(struct Node*headNode, char*fileName){
FILE *fp;
fp = fopen(fileName, "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");
}