一、软件功能描述
模块功能说明
1 .add(LinkList *&L) : 添加新的学生信息
2 .expurgate(LinkList *L): 删除已有学生信息
3 . alter(LinkList *L) : 修改已有学生信息
4 .display(LinkList *&L) :浏览全部学生信息
5 .inquire(LinkList *L) :查询单个学生信息
6 .sort(LinkList *L) :排名及统计
7 .seek(LinkList *L) :用于搜索最高分学生
二、 程序设计与实现
(一) 数据结构描述
1 学生节点:
typedef struct Student
{
char name[100];
char xuehao[100];
char id[100];
char sex[20];
char address[200];
int age;
char nation[20];
int sum;
double ave;
Score score;
}stu;
2 课程节点:
typedef struct score
{
int score_c;
int score_math;
int score_english;
int score_chinese;
int score_sports;
}Score;
3 链表节点:
typedef struct LinkNode
{
stu data;
struct LinkNode *next;
}LinkList;
(二)菜单模块
(1)int main( ):主函数,负责菜单调用
(2)void MainMenu():主菜单
(3) void readFile(LinkList *L):运行前把文件内容读取到电脑内存
(4)void saveFile(LinkList *L):保存学生信息到文件
(三)输入菜单模块
(1)seek(LinkList *L): 搜索函数(用于搜索最高分学生信息)
(2)sort(LinkList *L):排名及统计的函数,用于查询、排榜
(3)ListInsert(LinkList *&L,LinkList *p):用于在链表中插入新节点
(4)InitList(LinkList *&L):初始化链表
(四)数据查询
inquire(LinkList *L):用于查询单个学生信息的函数
(五)数据删除
expurgate(LinkList *L):用于删除学生信息的函数
(六)数据修改
alter(LinkList *L):用于修改学生信息的函数
(七)数据添加
add(LinkList *L):用于添加学生信息的函数
(八)数据浏览
display(LinkList *L):用于浏览全部学生信息的函数
三、代码实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#include<Windows.h>
typedef struct score
{
int score_c; //C语言成绩
int score_math; //高数成绩
int score_english; //英语成绩
int score_chinese; //语文成绩
int score_sports; //体育成绩
}Score;
typedef struct Student
{
char name[100]; //姓名
char xuehao[100]; //学号
char id[100]; //身份证号
char sex[20]; //性别
char address[200]; //地址
int age; //年龄
char nation[20]; //民族
int sum; //总成绩
double ave; //平均分
Score score; //成绩
}stu;
typedef struct LinkNode//定义节点数据类型
{
stu data;//链表长度
struct LinkNode *next;
}LinkList;
void MainMenu()//主菜单
{
printf(" ****************************\n");
printf(" **欢迎来到学生信息管理系统**\n");
printf(" *******AI211 Meredith*******\n");
printf(" ****************************\n");
printf(" ****************************\n");
printf(" **** 1、添加新学生信息 ***\n");
printf(" **** 2、删除学生信息 ***\n");
printf(" **** 3、修改学生信息 ***\n");
printf(" **** 4、显示学生信息 ***\n");
printf(" **** 5、排名及统计 ***\n");
printf(" **** 6、退出系统 ***\n");
printf(" ****************************\n");
}
void InitList(LinkList *&Head)//初始化链表
{
Head=(LinkList *)malloc(sizeof(LinkList));
Head->next=NULL; //初始化首节点为空
}
void ListInsert(LinkList *Head,LinkList *p)//插入新节点
{
LinkList *q=Head;
while(q->next!=NULL)
{
q=q->next;
}
p->next=NULL;
q->next=p;
}
void seek(LinkList *Head)//搜索函数(用于搜索最高分学生信息)
{
if(Head->next==NULL)
{
return;
}
int max=0;
LinkList *q=Head->next;
int OPtion;
scanf("%d",&OPtion);
switch(OPtion)
{
case 1:
{
while(q)//c语言最高分信息
{
if(q->data.score.score_c>max)
{
max=q->data.score.score_c;
}
q=q->next;
}
q=Head->next;
while(q)
{
if(q->data.score.score_c==max)
{
printf("学号:%s 姓名:%s 身份证号:%s 性别:%s 民族:%s 地址:%s c语言:%d 高数:%d 英语:%d 语文:%d 体育:%d 年龄:%d\n",q->data.xuehao,q->data.name,q->data.id,q->data.sex,q->data.nation,q->data.address,q->data.score.score_c,q->data.score.score_math,q->data.score.score_english,q->data.score.score_chinese,q->data.score.score_sports,q->data.age);
}
q=q->next;
}
}
break;
case 2:
{
while(q)//高数最高分信息
{
if(q->data.score.score_math>max)
{
max=q->data.score.score_math;
}
q=q->next;
}
q=Head->next;
while(q)
{
if(q->data.score.score_math==max)
{
printf("学号:%s 姓名:%s 身份证号:%s 性别:%s 民族:%s 地址:%s c语言:%d 高数:%d 英语:%d 语文:%d 体育:%d 年龄:%d\n",q->data.xuehao,q->data.name,q->data.id,q->data.sex,q->data.nation,q->data.address,q->data.score.score_c,q->data.score.score_math,q->data.score.score_english,q->data.score.score_chinese,q->data.score.score_sports,q->data.age);
}
q=q->next;
}
}
break;
case 3:
{
while(q)//英语最高分信息
{
if(q->data.score.score_english>max)
{
max=q->data.score.score_english;
}
q=q->next;
}
q=Head->next;
while(q)
{
if(q->data.score.score_english==max)
{
printf("学号:%s 姓名:%s 身份证号:%s 性别:%s 民族:%s 地址:%s c语言:%d 高数:%d 英语:%d 语文:%d 体育:%d 年龄:%d\n",q->data.xuehao,q->data.name,q->data.id,q->data.sex,q->data.nation,q->data.address,q->data.score.score_c,q->data.score.score_math,q->data.score.score_english,q->data.score.score_chinese,q->data.score.score_sports,q->data.age);
}
q=q->next;
}
}
break;
case 4:
{
while(q)//语文最高分信息
{
if(q->data.score.score_chinese>max)
{
max=q->data.score.score_chinese;
}
q=q->next;
}
q=Head->next;
while(q)
{
if(q->data.score.score_chinese==max)
{
printf("学号:%s 姓名:%s 身份证号:%s 性别:%s 民族:%s 地址:%s c语言:%d 高数:%d 英语:%d 语文:%d 体育:%d 年龄:%d\n",q->data.xuehao,q->data.name,q->data.id,q->data.sex,q->data.nation,q->data.address,q->data.score.score_c,q->data.score.score_math,q->data.score.score_english,q->data.score.score_chinese,q->data.score.score_sports,q->data.age);
}
q=q->next;
}
}
break;
case 5:
{
while(q)//体育最高分信息
{
if(q->data.score.score_sports>max)
{
max=q->data.score.score_sports;
}
q=q->next;
}
q=Head->next;
while(q)
{
if(q->data.score.score_sports==max)
{
printf("学号:%s 姓名:%s 身份证号:%s 性别:%s 民族:%s 地址:%s c语言:%d 高数:%d 英语:%d 语文:%d 体育:%d 年龄:%d\n",q->data.xuehao,q->data.name,q->data.id,q->data.sex,q->data.nation,q->data.address,q->data.score.score_c,q->data.score.score_math,q->data.score.score_english,q->data.score.score_chinese,q->data.score.score_sports,q->data.age);
}
q=q->next;
}
}
break;
default:
{
printf("请输入正确选项\n");
}
break;
}
}
void alter(LinkList *Head)//修改学生信息
{
int flag=0;
printf("请输入您要修改学生的学号:\n");
char Xuehao[100];
scanf("%s",Xuehao);
LinkList *q=Head->next;
if(Head->next==NULL)//判断该生是否存在
{
printf("没有该生信息!\n");
return;
}
while(q!=NULL)
{
if(strcmp(q->data.xuehao,Xuehao)==0)
{
flag=1;
printf("请输入您要修改的信息选项:1.姓名 2.成绩(c语言,高数,英语,语文,体育) 3.年龄 4.性别 5.身份证号 6.民族 7.地址\n");
int option;
scanf("%d",&option);
switch(option)
{
case 1:
{
char Name[100];
printf("请输入您要修改的名字:");
scanf("%s",Name);
printf("修改的名字为:%s\n",Name);
strcpy(q->data.name,Name);
printf("修改名字成功!\n");
break;
}
case 2:
{
Score sc;
printf("请输入您要修改的成绩(依次按照c语言、高数、英语、语文、体育写):");
scanf("%d%d%d%d%d",&sc.score_c,&sc.score_math,&sc.score_english,&sc.score_chinese,&sc.score_sports);
printf("修改的c语言成绩为:%d 修改的高数成绩为:%d 修改的英语成绩为:%d 修改的语文成绩为:%d 修改的体育成绩为:%d\n",sc.score_c,sc.score_math,sc.score_english,sc.score_chinese,sc.score_sports);
q->data.score=sc;
printf("修改成绩成功!\n");
break;
}
case 3:
{
int Age;
printf("请输入您要修改的年龄:");
scanf("%d",&Age);
printf("修改的年龄为:%d\n",Age);
q->data.age=Age;
printf("修改年龄成功!\n");
break;
}
case 4:
{
char Sex[10];
printf("请输入您要修改的性别:");
scanf("%s",Sex);
printf("修改的性别为:%s\n",Sex);
strcpy(q->data.sex,Sex);
printf("修改性别成功!\n");
break;
}
case 5:
{
char Id[100];
printf("请输入您要修改的身份证号:");
scanf("%s",Id);
printf("修改的身份证号为:%s\n",Id);
strcpy(q->data.id,Id);
printf("修改身份证号成功!\n");
break;
}
case 6:
{
char Nation[50];
printf("请输入您要修改的民族:");
scanf("%s",Nation);
printf("修改的民族为:%s\n",Nation);
strcpy(q->data.nation,Nation);
printf("修改民族成功!\n");
break;
}
case 7:
{
char Address[100];
printf("请输入您要修改的地址:");
scanf("%s",Address);
printf("修改的地址为:%s\n",Address);
strcpy(q->data.address,Address);
printf("修改地址成功!\n");
break;
}
default:
{
printf("请输入正确的选项!\n");
break;
}
}
}
q=q->next;
}
if(flag==0)
{
printf("该生不存在\n");
}
}
void expurgate(LinkList *Head)//删除学生信息
{
printf("1.按学号删除\n");
printf("2.按姓名删除\n");
printf("请输入您的选项:\n");
int CHOICE;
scanf("%d",&CHOICE);
switch(CHOICE)
{
case 1:
{
char Xuehao[100];
printf("请输入您要删除的学生的学号:");
scanf("%s",Xuehao);
while(strlen(Xuehao)!=10)
{
fflush(stdin);
printf("请输入十位数字的学号!\n");
printf("学号:\n");
scanf("%s",Xuehao);
}
LinkList *p,*pa;
if(Head->next==NULL)//判断该生是否存在
{
printf("没有学生信息\n");
return;
}
pa=Head;
p=pa->next;
int flag=0;
while(p)
{
if(strcmp(p->data.xuehao,Xuehao)==0)
{
flag=1;
printf("是否确认删除?\n");
printf("1.确认\n");
printf("2.取消,返回第一步\n");
printf("请输入您的选项:\n");
int OPTION;
scanf("%d",&OPTION);
switch(OPTION)
{
case 1:
{
pa->next=p->next;//删除数据
free(p);//释放内存
printf("删除学生成功\n");
}
break;
case 2:
{
system("cls");//清屏
MainMenu();
}
break;
default:
{
printf("请输入正确选项!\n");
}
break;
}
break;
}
pa=pa->next;
p=p->next;
}
if(flag==0)
{
printf("这个学生不存在\n");
}
}
break;
case 2:
{
char Name[20];
printf("请输入您要删除的学生的姓名:");
scanf("%s",Name);
getchar();
LinkList *p,*pa;
if(Head->next==NULL)//判断该生是否存在
{
printf("没有学生信息\n");
return;
}
pa=Head;
p=pa->next;
int sum=0;
while(p)
{
if(strcmp(p->data.name,Name)==0)
{
sum++;
}
p=p->next;
}
p=pa->next;
if(sum==1)
{
int flag=0;
while(p)
{
if(strcmp(p->data.name,Name)==0)
{
flag=1;
printf("是否确认删除?\n");
printf("1.确认\n");
printf("2.取消,返回第一步\n");
printf("请输入您的选项:\n");
int OPTION;
scanf("%d",&OPTION);
switch(OPTION)
{
case 1:
{
pa->next=p->next;//删除数据
free(p);//释放内存
printf("删除学生成功\n");
}
break;
case 2:
{
system("cls");//清屏
MainMenu();
}
break;
default:
{
printf("请输入正确选项!\n");
}
break;
}
break;
}
pa=pa->next;
p=p->next;
}
if(flag==0)
{
printf("这个学生不存在\n");
}
}
else
{
printf("姓名为%s的学生有%d个,请根据学号删除!\n",Name,sum);
char Xuehao[100];
printf("请输入您要删除的学生的学号:");
scanf("%s",Xuehao);
LinkList *p,*pa;
if(Head->next==NULL)//判断该生是否存在
{
printf("没有学生信息\n");
return;
}
pa=Head;
p=pa->next;
int flag=0;
while(p)
{
if(strcmp(p->data.xuehao,Xuehao)==0)
{
flag=1;
printf("是否确认删除?\n");
printf("1.确认\n");
printf("2.取消,返回第一步\n");
printf("请输入您的选项:\n");
int OPTION;
scanf("%d",&OPTION);
switch(OPTION)
{
case 1:
{
pa->next=p->next;//删除数据
free(p);//释放内存
printf("删除学生成功\n");
}
break;
case 2:
{
system("cls");//清屏
MainMenu();
}
break;
default:
{
printf("请输入正确选项!\n");
}
break;
}
break;
}
pa=pa->next;
p=p->next;
}
if(flag==0)
{
printf("这个学生不存在\n");
}
}
}
break;
default:
printf("请输入正确选项!\n");
break;
}
}
void add(LinkList *Head)//增加学生信息
{
char Xuehao[100];
printf("请输入学生的信息:\n");
printf("学号:");
scanf("%s",Xuehao);
while(strlen(Xuehao)!=10)
{
fflush(stdin);
printf("请输入十位数字的学号!\n");
printf("学号:\n");
scanf("%s",Xuehao);
}
LinkList *q=Head->next;
while(q!=NULL)//判断学生信息是否存在
{
if(strcmp(q->data.xuehao,Xuehao)==0)
{
printf("该学生已存在\n");
break;
}
q=q->next;
}
if(q==NULL)
{
LinkList *p;
InitList(p);
strcpy(p->data.xuehao,Xuehao);
printf("姓名:");
char Name[100];
scanf("%s",Name);
strcpy(p->data.name,Name);
printf("身份证号:");
char Id[100];
scanf("%s",Id);
while(strlen(Id)!=18)
{
fflush(stdin);
printf("请输入十八位的身份证号!\n");
printf("身份证号:\n");
scanf("%s",Id);
}
strcpy(p->data.id,Id);
printf("性别:");
char Sex[20];
scanf("%s",Sex);
char boy[10]={"男"};
char girl[10]={"女"};
while(strcmp(Sex,boy)!=0&&strcmp(Sex,girl)!=0)
{
printf("请输入正确的性别:\n");
scanf("%s",Sex);
}
strcpy(p->data.sex,Sex);
printf("民族:");
char Nation[50];
scanf("%s",Nation);
strcpy(p->data.nation,Nation);
printf("地址:");
char Address[100];
scanf("%s",Address);
strcpy(p->data.address,Address);
printf("C语言成绩:");
Score sc;
scanf("%d",&sc.score_c);
while(sc.score_c<0||sc.score_c>100)
{
printf("输入错误,请重新输入\n");
scanf("%d",&sc.score_c);
}
p->data.score.score_c=sc.score_c;
printf("高数成绩:");
scanf("%d",&sc.score_math);
while(sc.score_math<0||sc.score_math>100)
{
printf("输入错误,请重新输入\n");
scanf("%d",&sc.score_math);
}
p->data.score.score_math=sc.score_math;
printf("英语成绩:");
scanf("%d",&sc.score_english);
while(sc.score_english<0||sc.score_english>100)
{
printf("输入错误,请重新输入\n");
scanf("%d",&sc.score_english);
}
p->data.score.score_english=sc.score_english;
printf("语文成绩:");
scanf("%d",&sc.score_chinese);
while(sc.score_chinese<0||sc.score_chinese>100)
{
printf("输入错误,请重新输入\n");
scanf("%d",&sc.score_chinese);
}
p->data.score.score_chinese=sc.score_chinese;
printf("体育成绩:");
scanf("%d",&sc.score_sports);
while(sc.score_sports<0||sc.score_sports>100)
{
printf("输入错误,请重新输入\n");
scanf("%d",&sc.score_sports);
}
p->data.score.score_sports=sc.score_sports;
printf("年龄:");
int Age;
scanf("%d",&Age);
p->data.age=Age;
ListInsert(Head,p);
printf("添加成功!\n");
}
}
void inquire(LinkList *Head)//查询学生信息
{
LinkList *q=Head->next;
printf("1.按学生学号输入\n");
printf("2.按学生姓名输入\n");
printf("请输入您的选项:\n");
int CHoose;
scanf("%d",&CHoose);
switch(CHoose)
{
case 1:
printf("请输入您要查询的学生学号:\n");
char Xuehao[100];
scanf("%s",Xuehao);
while(strlen(Xuehao)!=10)
{
fflush(stdin);
printf("请输入十位数字的学号!\n");
printf("学号:\n");
scanf("%s",Xuehao);
}
while(q!=NULL)
{
if(strcmp(q->data.xuehao,Xuehao)==0)
{
printf("姓名:%s\n",q->data.name);
printf("学号:%s\n",q->data.xuehao);
printf("身份证号:%s\n",q->data.id);
printf("性别:%s\n",q->data.sex);
printf("民族:%s\n",q->data.nation);
printf("地址:%s\n",q->data.address);
printf("c语言成绩:%d\n",q->data.score.score_c);
printf("高数成绩:%d\n",q->data.score.score_math);
printf("英语成绩:%d\n",q->data.score.score_english);
printf("语文成绩:%d\n",q->data.score.score_chinese);
printf("体育成绩:%d\n",q->data.score.score_sports);
printf("年龄:%d\n",q->data.age);
}
q=q->next;
}
if(q==NULL)//判断该生是否存在
{
printf("没有学生信息\n");
return;
}
break;
case 2:
{
int flag=0;
printf("请输入您要查询的学生姓名:\n");
char Name[50];
scanf("%s",Name);
while(q!=NULL)
{
if(strcmp(q->data.name,Name)==0)
{
flag=1;
printf("姓名:%s\n",q->data.name);
printf("学号:%s\n",q->data.xuehao);
printf("身份证号:%s\n",q->data.id);
printf("性别:%s\n",q->data.sex);
printf("民族:%s\n",q->data.nation);
printf("地址:%s\n",q->data.address);
printf("c语言成绩:%d\n",q->data.score.score_c);
printf("高数成绩:%d\n",q->data.score.score_math);
printf("英语成绩:%d\n",q->data.score.score_english);
printf("语文成绩:%d\n",q->data.score.score_chinese);
printf("体育成绩:%d\n",q->data.score.score_sports);
printf("年龄:%d\n",q->data.age);
}
q=q->next;
}
if(flag==0)
{
printf("该生不存在\n");
}
}
break;
default:
{
printf("请输入正确选项!\n");
}
break;
}
}
void display(LinkList *Head)//浏览全部学生信息
{
LinkList *q=Head->next;
if(q==NULL)
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
else
{
printf("| 学号 | 姓名 | 身份证号 |性别| 民族 | 地址 |c语言|高数|英语|语文|体育|年龄|\n");
printf("--------------------------------------------------------------------------------------------------------------\n");
while(q)
{
printf("|%s|%-8s|%-20s|%-4s|%-8s|%-22s|%-4d|%-5d|%-4d|%-4d|%-4d|%-4d|\n",q->data.xuehao,q->data.name,q->data.id,q->data.sex,q->data.nation,q->data.address,q->data.score.score_c,q->data.score.score_math,q->data.score.score_english,q->data.score.score_chinese,q->data.score.score_sports,q->data.age);
q=q->next;
}
}
}
void sort(LinkList *Head)//排名及统计(冒泡排序)
{
printf("A.查询学生人数\n");
printf("B.按性别查询学生人数\n");
printf("C.按民族查询学生人数\n");
printf("D.按照平均分数排名\n");
printf("E.给学生排榜\n");
printf("F.查询获得某课程的最高分的学生信息\n");
char choose;
getchar();//防止吃回车
scanf("%c",&choose);
switch(choose)
{
case 'A'://查询学生人数
{
int total=0;
LinkList *q=Head;
while(q!=NULL)
{
total++;
q=q->next;
}
printf("学生人数有%d个\n",total-1);
break;
}
case 'B'://按性别查询学生人数
{
printf("查找的性别:\n");
char SEX[3];
scanf("%s",SEX);
int sum=0;
LinkList *q=Head->next;
while(q!=NULL)
{
if(strcmp(q->data.sex,SEX)==0)
{
sum++;
}
q=q->next;
}
printf("性别为%s的学生有%d个\n",SEX,sum);
break;
}
case 'C'://按民族查询学生人数
{
printf("查找的民族为:\n");
char NATion[50];
scanf("%s",NATion);
int sum=0;
LinkList *p=Head->next;
while(p!=NULL)
{
if(strcmp(p->data.nation,NATion)==0)
{
sum++;
}
p=p->next;
}
printf("民族为%s的学生有%d个\n",NATion,sum);
break;
}
case 'D': //统计并排名学生平均分数
{
LinkList *q,*p,*r=Head->next;
if(r==NULL)//判断学生信息是否存在
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r)//用两层循环完成排序
{
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂时存放一个节点
InitList(tmp);//初始化
while(q)
{
p->data.ave=(p->data.score.score_c+p->data.score.score_math+p->data.score.score_english+p->data.score.score_chinese+p->data.score.score_sports)/5.0;
q->data.ave=(q->data.score.score_c+q->data.score.score_math+q->data.score.score_english+q->data.score.score_chinese+q->data.score.score_sports)/5.0;
if(q->data.ave>p->data.ave)//平均分由大到小
{
tmp->data.ave=q->data.ave;//先复制q节点信息到tmp
strcpy(tmp->data.name,q->data.name);
strcpy(tmp->data.xuehao,q->data.xuehao);
strcpy(tmp->data.id,q->data.id);
strcpy(tmp->data.sex,q->data.sex);
strcpy(tmp->data.nation,q->data.nation);
strcpy(tmp->data.address,q->data.address);
tmp->data.age=q->data.age;
tmp->data.score.score_c=q->data.score.score_c;
tmp->data.score.score_math=q->data.score.score_math;
tmp->data.score.score_english=q->data.score.score_english;
tmp->data.score.score_chinese=q->data.score.score_chinese;
tmp->data.score.score_sports=q->data.score.score_sports;
q->data.ave=p->data.ave;//再复制p节点信息到q
strcpy(q->data.name,p->data.name);
strcpy(q->data.xuehao,p->data.xuehao);
strcpy(q->data.id,p->data.id);
strcpy(q->data.sex,p->data.sex);
strcpy(q->data.nation,p->data.nation);
strcpy(q->data.address,p->data.address);
q->data.age=p->data.age;
q->data.score.score_c=p->data.score.score_c;
q->data.score.score_math=p->data.score.score_math;
q->data.score.score_english=p->data.score.score_english;
q->data.score.score_chinese=p->data.score.score_chinese;
q->data.score.score_sports=p->data.score.score_sports;
p->data.ave=tmp->data.ave;//最后复制节点信息到p
strcpy(p->data.name,tmp->data.name);
strcpy(p->data.xuehao,tmp->data.xuehao);
strcpy(p->data.id,tmp->data.id);
strcpy(p->data.sex,tmp->data.sex);
strcpy(p->data.nation,tmp->data.nation);
strcpy(p->data.address,tmp->data.address);
p->data.age=tmp->data.age;
p->data.score.score_c=tmp->data.score.score_c;
p->data.score.score_math=tmp->data.score.score_math;
p->data.score.score_english=tmp->data.score.score_english;
p->data.score.score_chinese=tmp->data.score.score_chinese;
p->data.score.score_sports=tmp->data.score.score_sports;
}//完成数据交换
q=q->next;
}
r=r->next;
}
display(Head);
break;
}
case 'E'://给学生排榜(包括按课程排序)
{
printf("*************************************\n");
printf("**** 1、按照总成绩排榜 ***\n");
printf("**** 2、按照c语言成绩排榜 ***\n");
printf("**** 3、按照高数成绩排榜 ***\n");
printf("**** 4、按照英语成绩排榜 ***\n");
printf("**** 5、按照语文成绩排榜 ***\n");
printf("**** 6、按照体育成绩排榜 ***\n");
printf("*************************************\n");
int choice;
scanf("%d",&choice);
switch(choice)
{
case 1:
{
LinkList *q,*p,*r=Head->next;
if(r==NULL)//判断学生信息是否存在
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r)//用两层循环完成排序
{
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂时存放一个节点
InitList(tmp);
while(q)
{
p->data.sum=p->data.score.score_c+p->data.score.score_math+p->data.score.score_english+p->data.score.score_chinese+p->data.score.score_sports;
q->data.sum=q->data.score.score_c+q->data.score.score_math+q->data.score.score_english+q->data.score.score_chinese+q->data.score.score_sports;
if(q->data.sum>p->data.sum)//总成绩由大到小
{
tmp->data.sum=q->data.sum;//先复制q节点信息到tmp
strcpy(tmp->data.name,q->data.name);
strcpy(tmp->data.xuehao,q->data.xuehao);
strcpy(tmp->data.id,q->data.id);
strcpy(tmp->data.sex,q->data.sex);
strcpy(tmp->data.nation,q->data.nation);
strcpy(tmp->data.address,q->data.address);
tmp->data.age=q->data.age;
tmp->data.score.score_c=q->data.score.score_c;
tmp->data.score.score_math=q->data.score.score_math;
tmp->data.score.score_english=q->data.score.score_english;
tmp->data.score.score_chinese=q->data.score.score_chinese;
tmp->data.score.score_sports=q->data.score.score_sports;
q->data.sum=p->data.sum;//再复制p节点信息到q
strcpy(q->data.name,p->data.name);
strcpy(q->data.xuehao,p->data.xuehao);
strcpy(q->data.id,p->data.id);
strcpy(q->data.sex,p->data.sex);
strcpy(q->data.nation,p->data.nation);
strcpy(q->data.address,p->data.address);
q->data.age=p->data.age;
q->data.score.score_c=p->data.score.score_c;
q->data.score.score_math=p->data.score.score_math;
q->data.score.score_english=p->data.score.score_english;
q->data.score.score_chinese=p->data.score.score_chinese;
q->data.score.score_sports=p->data.score.score_sports;
p->data.sum=tmp->data.sum;//最后复制节点信息到p
strcpy(p->data.name,tmp->data.name);
strcpy(p->data.xuehao,tmp->data.xuehao);
strcpy(p->data.id,tmp->data.id);
strcpy(p->data.sex,tmp->data.sex);
strcpy(p->data.nation,tmp->data.nation);
strcpy(p->data.address,tmp->data.address);
p->data.age=tmp->data.age;
p->data.score.score_c=tmp->data.score.score_c;
p->data.score.score_math=tmp->data.score.score_math;
p->data.score.score_english=tmp->data.score.score_english;
p->data.score.score_chinese=tmp->data.score.score_chinese;
p->data.score.score_sports=tmp->data.score.score_sports;
}//完成数据交换
q=q->next;
}
r=r->next;
}
display(Head);
break;
}
case 2:
{
LinkList *q,*p,*r=Head->next;
if(r==NULL)//判断学生信息是否存在
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r)//用两层循环完成排序
{
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂时存放一个节点
InitList(tmp);//初始化
while(q)
{
if(q->data.score.score_c>p->data.score.score_c)//c语言成绩由大到小
{
strcpy(tmp->data.name,q->data.name);//先复制q节点信息到tmp
strcpy(tmp->data.xuehao,q->data.xuehao);
strcpy(tmp->data.id,q->data.id);
strcpy(tmp->data.sex,q->data.sex);
strcpy(tmp->data.nation,q->data.nation);
strcpy(tmp->data.address,q->data.address);
tmp->data.age=q->data.age;
tmp->data.score.score_c=q->data.score.score_c;
tmp->data.score.score_math=q->data.score.score_math;
tmp->data.score.score_english=q->data.score.score_english;
tmp->data.score.score_chinese=q->data.score.score_chinese;
tmp->data.score.score_sports=q->data.score.score_sports;
strcpy(q->data.name,p->data.name);//再复制p节点信息到q
strcpy(q->data.xuehao,p->data.xuehao);
strcpy(q->data.id,p->data.id);
strcpy(q->data.sex,p->data.sex);
strcpy(q->data.nation,p->data.nation);
strcpy(q->data.address,p->data.address);
q->data.age=p->data.age;
q->data.score.score_c=p->data.score.score_c;
q->data.score.score_math=p->data.score.score_math;
q->data.score.score_english=p->data.score.score_english;
q->data.score.score_chinese=p->data.score.score_chinese;
q->data.score.score_sports=p->data.score.score_sports;
strcpy(p->data.name,tmp->data.name);//最后复制节点信息到p
strcpy(p->data.xuehao,tmp->data.xuehao);
strcpy(p->data.id,tmp->data.id);
strcpy(p->data.sex,tmp->data.sex);
strcpy(p->data.nation,tmp->data.nation);
strcpy(p->data.address,tmp->data.address);
p->data.age=tmp->data.age;
p->data.score.score_c=tmp->data.score.score_c;
p->data.score.score_math=tmp->data.score.score_math;
p->data.score.score_english=tmp->data.score.score_english;
p->data.score.score_chinese=tmp->data.score.score_chinese;
p->data.score.score_sports=tmp->data.score.score_sports;
}//完成数据交换
q=q->next;
}
r=r->next;
}
display(Head);
break;
}
case 3:
{
LinkList *q,*p,*r=Head->next;
if(r==NULL)//判断学生信息是否存在
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r)//用两层循环完成排序
{
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂时存放一个节点
InitList(tmp);//初始化
while(q)
{
if(q->data.score.score_math>p->data.score.score_math)//高数成绩由大到小
{
strcpy(tmp->data.name,q->data.name);//先复制q节点信息到tmp
strcpy(tmp->data.xuehao,q->data.xuehao);
strcpy(tmp->data.id,q->data.id);
strcpy(tmp->data.sex,q->data.sex);
strcpy(tmp->data.nation,q->data.nation);
strcpy(tmp->data.address,q->data.address);
tmp->data.age=q->data.age;
tmp->data.score.score_c=q->data.score.score_c;
tmp->data.score.score_math=q->data.score.score_math;
tmp->data.score.score_english=q->data.score.score_english;
tmp->data.score.score_chinese=q->data.score.score_chinese;
tmp->data.score.score_sports=q->data.score.score_sports;
strcpy(q->data.name,p->data.name);//再复制p节点信息到q
strcpy(q->data.xuehao,p->data.xuehao);
strcpy(q->data.id,p->data.id);
strcpy(q->data.sex,p->data.sex);
strcpy(q->data.nation,p->data.nation);
strcpy(q->data.address,p->data.address);
q->data.age=p->data.age;
q->data.score.score_c=p->data.score.score_c;
q->data.score.score_math=p->data.score.score_math;
q->data.score.score_english=p->data.score.score_english;
q->data.score.score_chinese=p->data.score.score_chinese;
q->data.score.score_sports=p->data.score.score_sports;
strcpy(p->data.name,tmp->data.name);//最后复制节点信息到p
strcpy(p->data.xuehao,tmp->data.xuehao);
strcpy(p->data.id,tmp->data.id);
strcpy(p->data.sex,tmp->data.sex);
strcpy(p->data.nation,tmp->data.nation);
strcpy(p->data.address,tmp->data.address);
p->data.age=tmp->data.age;
p->data.score.score_c=tmp->data.score.score_c;
p->data.score.score_math=tmp->data.score.score_math;
p->data.score.score_english=tmp->data.score.score_english;
p->data.score.score_chinese=tmp->data.score.score_chinese;
p->data.score.score_sports=tmp->data.score.score_sports;
}//完成数据交换
q=q->next;
}
r=r->next;
}
display(Head);
break;
}
case 4:
{
LinkList *q,*p,*r=Head->next;
if(r==NULL)//判断学生信息是否存在
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r)//用两层循环完成排序
{
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂时存放一个节点
InitList(tmp);//初始化
while(q)
{
if(q->data.score.score_english>p->data.score.score_english)//英语成绩由大到小
{
strcpy(tmp->data.name,q->data.name);//先复制q节点信息到tmp
strcpy(tmp->data.xuehao,q->data.xuehao);
strcpy(tmp->data.id,q->data.id);
strcpy(tmp->data.sex,q->data.sex);
strcpy(tmp->data.nation,q->data.nation);
strcpy(tmp->data.address,q->data.address);
tmp->data.age=q->data.age;
tmp->data.score.score_c=q->data.score.score_c;
tmp->data.score.score_math=q->data.score.score_math;
tmp->data.score.score_english=q->data.score.score_english;
tmp->data.score.score_chinese=q->data.score.score_chinese;
tmp->data.score.score_sports=q->data.score.score_sports;
strcpy(q->data.name,p->data.name);//再复制p节点信息到q
strcpy(q->data.xuehao,p->data.xuehao);
strcpy(q->data.id,p->data.id);
strcpy(q->data.sex,p->data.sex);
strcpy(q->data.nation,p->data.nation);
strcpy(q->data.address,p->data.address);
q->data.age=p->data.age;
q->data.score.score_c=p->data.score.score_c;
q->data.score.score_math=p->data.score.score_math;
q->data.score.score_english=p->data.score.score_english;
q->data.score.score_chinese=p->data.score.score_chinese;
q->data.score.score_sports=p->data.score.score_sports;
strcpy(p->data.name,tmp->data.name);//最后复制节点信息到p
strcpy(p->data.xuehao,tmp->data.xuehao);
strcpy(p->data.id,tmp->data.id);
strcpy(p->data.sex,tmp->data.sex);
strcpy(p->data.nation,tmp->data.nation);
strcpy(p->data.address,tmp->data.address);
p->data.age=tmp->data.age;
p->data.score.score_c=tmp->data.score.score_c;
p->data.score.score_math=tmp->data.score.score_math;
p->data.score.score_english=tmp->data.score.score_english;
p->data.score.score_chinese=tmp->data.score.score_chinese;
p->data.score.score_sports=tmp->data.score.score_sports;
}//完成数据交换
q=q->next;
}
r=r->next;
}
display(Head);
break;
}
case 5:
{
LinkList *q,*p,*r=Head->next;
if(r==NULL)//判断学生信息是否存在
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r)//用两层循环完成排序
{
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂时存放一个节点
InitList(tmp);//初始化
while(q)
{
if(q->data.score.score_chinese>p->data.score.score_chinese)//语文成绩由大到小
{
strcpy(tmp->data.name,q->data.name);//先复制q节点信息到tmp
strcpy(tmp->data.xuehao,q->data.xuehao);
strcpy(tmp->data.id,q->data.id);
strcpy(tmp->data.sex,q->data.sex);
strcpy(tmp->data.nation,q->data.nation);
strcpy(tmp->data.address,q->data.address);
tmp->data.age=q->data.age;
tmp->data.score.score_c=q->data.score.score_c;
tmp->data.score.score_math=q->data.score.score_math;
tmp->data.score.score_english=q->data.score.score_english;
tmp->data.score.score_chinese=q->data.score.score_chinese;
tmp->data.score.score_sports=q->data.score.score_sports;
strcpy(q->data.name,p->data.name);//再复制p节点信息到q
strcpy(q->data.xuehao,p->data.xuehao);
strcpy(q->data.id,p->data.id);
strcpy(q->data.sex,p->data.sex);
strcpy(q->data.nation,p->data.nation);
strcpy(q->data.address,p->data.address);
q->data.age=p->data.age;
q->data.score.score_c=p->data.score.score_c;
q->data.score.score_math=p->data.score.score_math;
q->data.score.score_english=p->data.score.score_english;
q->data.score.score_chinese=p->data.score.score_chinese;
q->data.score.score_sports=p->data.score.score_sports;
strcpy(p->data.name,tmp->data.name);//最后复制节点信息到p
strcpy(p->data.xuehao,tmp->data.xuehao);
strcpy(p->data.id,tmp->data.id);
strcpy(p->data.sex,tmp->data.sex);
strcpy(p->data.nation,tmp->data.nation);
strcpy(p->data.address,tmp->data.address);
p->data.age=tmp->data.age;
p->data.score.score_c=tmp->data.score.score_c;
p->data.score.score_math=tmp->data.score.score_math;
p->data.score.score_english=tmp->data.score.score_english;
p->data.score.score_chinese=tmp->data.score.score_chinese;
p->data.score.score_sports=tmp->data.score.score_sports;
}//完成数据交换
q=q->next;
}
r=r->next;
}
display(Head);
break;
}
case 6:
{
LinkList *q,*p,*r=Head->next;
if(r==NULL)//判断学生信息是否存在
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r)//用两层循环完成排序
{
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂时存放一个节点
InitList(tmp);//初始化
while(q)
{
if(q->data.score.score_sports>p->data.score.score_sports)//体育成绩由大到小
{
strcpy(tmp->data.name,q->data.name);//先复制q节点信息到tmp
strcpy(tmp->data.xuehao,q->data.xuehao);
strcpy(tmp->data.id,q->data.id);
strcpy(tmp->data.sex,q->data.sex);
strcpy(tmp->data.nation,q->data.nation);
strcpy(tmp->data.address,q->data.address);
tmp->data.age=q->data.age;
tmp->data.score.score_c=q->data.score.score_c;
tmp->data.score.score_math=q->data.score.score_math;
tmp->data.score.score_english=q->data.score.score_english;
tmp->data.score.score_chinese=q->data.score.score_chinese;
tmp->data.score.score_sports=q->data.score.score_sports;
strcpy(q->data.name,p->data.name);//再复制p节点信息到q
strcpy(q->data.xuehao,p->data.xuehao);
strcpy(q->data.id,p->data.id);
strcpy(q->data.sex,p->data.sex);
strcpy(q->data.nation,p->data.nation);
strcpy(q->data.address,p->data.address);
q->data.age=p->data.age;
q->data.score.score_c=p->data.score.score_c;
q->data.score.score_math=p->data.score.score_math;
q->data.score.score_english=p->data.score.score_english;
q->data.score.score_chinese=p->data.score.score_chinese;
q->data.score.score_sports=p->data.score.score_sports;
strcpy(p->data.name,tmp->data.name);//最后复制节点信息到p
strcpy(p->data.xuehao,tmp->data.xuehao);
strcpy(p->data.id,tmp->data.id);
strcpy(p->data.sex,tmp->data.sex);
strcpy(p->data.nation,tmp->data.nation);
strcpy(p->data.address,tmp->data.address);
p->data.age=tmp->data.age;
p->data.score.score_c=tmp->data.score.score_c;
p->data.score.score_math=tmp->data.score.score_math;
p->data.score.score_english=tmp->data.score.score_english;
p->data.score.score_chinese=tmp->data.score.score_chinese;
p->data.score.score_sports=tmp->data.score.score_sports;
}//完成数据交换
q=q->next;
}
r=r->next;
}
display(Head);
break;
}
default:
{
printf("请输入正确的选项!\n");
break;
}
}
break;
case 'F':
{
LinkList *q=Head->next;
printf("******************************\n");
printf("**** 1、c语言 ***\n");
printf("**** 2、高数 ***\n");
printf("**** 3、英语 ***\n");
printf("**** 4、语文 ***\n");
printf("**** 5、体育 ***\n");
printf("******************************\n");
printf("请输入要查询的最高分学生信息的学科:\n");
seek(q);
}
break;
default:
printf("请输入正确的选项!\n");
break;
}
}
}
void readFile(LinkList *Head)//运行前把文件内容读取到电脑内存
{
FILE *fp1;
fp1=fopen("student.txt","r");//以只读方式打开当前目录下的文件
if(fp1==NULL)
{
printf("文件不存在\n");
exit(0);//终止程序
}
int i=0;
char XUehao[100]; //学号
char NAme[100]; //名字
char ID[100]; //身份证号
char SEx[10]; //性别
char NAtion[50]; //民族
char ADdress[100]; //地址
int AGe; //年龄
score sc; //成绩
while(fscanf(fp1," %s %s %s %s %s %s %d %d %d %d %d %d",XUehao,NAme,ID,SEx,NAtion,ADdress,&sc.score_c,&sc.score_math,&sc.score_english,&sc.score_chinese,&sc.score_sports,&AGe)!=EOF)
{
i++;
}
fclose(fp1);
FILE *fp2;
fp2=fopen("student.txt","r");//以只读方式打开当前目录下的文件
if(fp2==NULL)
{
printf("无法打开文件\n");
exit(0);//终止程序
}
int a=i;
int b=1;
char Xuehao[100]; //学号
char Name[100]; //名字
char Id[100]; //身份证号
char Sex[10]; //性别
char Nation[50]; //民族
char Address[100]; //地址
int Age; //年龄
while(fscanf(fp2," %s %s %s %s %s %s %d %d %d %d %d %d",Xuehao,Name,Id,Sex,Nation,Address,&sc.score_c,&sc.score_math,&sc.score_english,&sc.score_chinese,&sc.score_sports,&Age)!=EOF)
{
LinkList *m=(LinkList *)malloc(sizeof(LinkList));
strcpy(m->data.xuehao,Xuehao);//把后边内容拷贝到前边
strcpy(m->data.name,Name);
strcpy(m->data.id,Id);
strcpy(m->data.sex,Sex);
strcpy(m->data.nation,Nation);
strcpy(m->data.address,Address);
m->data.age=Age;
m->data.score=sc;
ListInsert(Head,m);//插入新节点
m=m->next;
if(a==b)
{
break;
}
b++;
}
fclose(fp2);//关闭文件
}
void saveFile(LinkList *Head)//保存学生信息到文件
{
FILE *fp;
LinkList *p=Head->next;
if((fp=fopen("student.txt","w"))==NULL)//以只写的方式打开当前目录下的文件
{
printf("不能打开此文件,请按任意键退出\n");
exit(1);//退出
}
while(p)
{
fprintf(fp,"%s\t%s\t%8s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->data.xuehao,p->data.name,p->data.id,p->data.sex,p->data.nation,p->data.address,p->data.score.score_c,p->data.score.score_math,p->data.score.score_english,p->data.score.score_chinese,p->data.score.score_sports,p->data.age);
p=p->next;
}
fclose(fp);
}
int main()
{
system("color 70");
int a=4;
printf("正在加载中");
while(a>=0)
{
Sleep(500);
printf("..........");
a--;
}
printf("加载成功!\n");
LinkList *Head;
InitList(Head);
readFile(Head);//运行前把文件内容读取到电脑
int Choose;
MainMenu();//主菜单
while(1)
{
fflush(stdin);//清空缓冲区
scanf("%d",&Choose);
switch(Choose)
{
case 1://添加信息
add(Head);
saveFile(Head);
system("pause");
MainMenu();
printf("请输入您接下来的选项:\n");
break;
case 2://删除信息
expurgate(Head);
saveFile(Head);
system("pause");
MainMenu();
printf("请输入您接下来的选项:\n");
break;
case 3://修改信息
alter(Head);
saveFile(Head);
system("pause");
MainMenu();
printf("请输入您接下来的选项:\n");
break;
case 4://显示信息
{
printf("1.显示全部学生信息\n");
printf("2.查询学生信息\n");
int CHOOSE;
scanf("%d",&CHOOSE);
switch(CHOOSE)
{
case 1:
display(Head);
break;
case 2:
inquire(Head);
break;
default:
printf("输入错误!\n");
break;
}
system("pause");
MainMenu();
printf("请输入您接下来的选项:\n");
}
break;
case 5://查询信息
sort(Head);
system("pause");
MainMenu();
printf("请输入您接下来的选项:\n");
break;
case 6://退出系统
return 0;
break;
default:
printf("输入错误,请重新输入\n");
system("pause");
MainMenu();
break;
}
}
return 0;
}
四、注意点
录入文件时应先添加文本文档"student.txt"且文档的编码应为ANSI,否则会打不开文件从而导致程序无法运行。