#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct score{
long no;//学号
int math;//数学成绩
int english;//英语成绩
int cLanguage;//c语言成绩
};
struct info{
long no;//学号
char name[13];//姓名
char sex[5];//性别
char major[40];//专业
struct score cj;
float average;//平均分
struct info *next;
};
void mainMenu(void); //显示主菜单格式
struct info *input(int *p);
void change (struct info *head);
void delet (struct info *head,int n);
void checkInfo(struct info *head);
void countScore(struct info *head);
void main()
{
int k,n;
struct info *head=NULL;
while(1)
{
system("cls");
mainMenu(); //显示主菜单格式
scanf("%d",&k);
switch(k)
{
case 1: head=input(&n);//输入学生基本信息
break;
case 2: change (head); //修改学生基本信息
break;
case 3: delet(head,n);//删除学生基本信息
break;
case 4: checkInfo(head); //通过输入学号,查看该学生的基本信息
break;
case 5: countScore(head);//统计每个学生的平均分,并按从高到低排序
case 6: exit(0);//退出系统
}
system("PAUSE");
}
}
void mainMenu(void) //显示主菜单格式
{
printf("***********学生信息管理系统*************\n");
printf("| 1. 输入学生基本信息 |\n");
printf("| 2. 修改学生基本信息 |\n");
printf("| 3. 删除学生基本信息 |\n");
printf("| 4. 输入学号,查看学生基本信息 |\n");
printf("| 5. 统计每个学生平均分,从高到低 |\n");
printf("| 6. 退出系统 |\n");
printf("****************************************\n");
printf(" 请输入选项(1~6): ");
}
struct info *input(int *p)//输入学生基本信息
{
struct info *head=NULL,*p1,*p2;
int n=0;
p1=p2=(struct info *)malloc(sizeof(struct info));//开辟动态存储空间
printf("学号:"); scanf("%ld",&p1->no);//输入学生信息
printf("姓名:"); scanf("%s",p1->name);
printf("性别:"); scanf("%s",p1->sex);
printf("专业:"); scanf("%s",p1->major);
printf("数学成绩:"); scanf("%d",&p1->cj.math);
printf("英语成绩:"); scanf("%d",&p1->cj.english);
printf("c语言成绩:"); scanf("%d",&p1->cj.cLanguage);
p1->cj.no=p1->no;
p1->average=(float)((p1->cj.math+p1->cj.english+p1->cj.cLanguage)/3);
while(p1->no!=0)
{
n++;
if(n==1) head=p1;
else { p2->next=p1;p2=p1; }
p1=(struct info *)malloc(sizeof(struct info));
printf("学号:"); scanf("%ld",&p1->no);
if(p1->no==0)//学号为零,退出
break;
printf("姓名:"); scanf("%s",p1->name);//输入学生信息
printf("性别:"); scanf("%s",p1->sex);
printf("专业:"); scanf("%s",p1->major);
printf("数学成绩:"); scanf("%d",&p1->cj.math);
printf("英语成绩:"); scanf("%d",&p1->cj.english);
printf("c语言成绩:"); scanf("%d",&p1->cj.cLanguage);
p1->cj.no=p1->no;
p1->average=(float)((p1->cj.math+p1->cj.english+p1->cj.cLanguage)/3);
}
p2->next=NULL; *p=n;
return(head);
}//创建链表
void change (struct info *head)//修改学生基本信息
{
long num;
struct info *p1;
p1=(struct info *)malloc(sizeof(struct info));
printf("输入要修改的学生学号:");scanf("%ld",&num);
for(p1=head;;p1=p1->next)
{
if(p1->no==num){
printf("学号:"); scanf("%ld",&p1->no);
printf("姓名:"); scanf("%s",p1->name);
printf("性别:"); scanf("%s",p1->sex);
printf("专业:"); scanf("%s",p1->major);
printf("数学成绩:"); scanf("%d",&p1->cj.math);
printf("英语成绩:"); scanf("%d",&p1->cj.english);
printf("c语言成绩:"); scanf("%d",&p1->cj.cLanguage);
p1->cj.no=p1->no;break;}
}//寻找需要修改的学生,重新输入信息,退出
}
void delet (struct info *head,int n)//删除学生基本信息
{
struct info *p,*q;
int j;
long num;
printf("\n输入要删除的学号");
scanf("%ld",&num);
p=q=head; j=1;
while(p!=NULL)
if (p->no==num)
{
if(j==1)//删除的是第一个学生
head=head->next;
else if(j==n)
q->next=NULL;//删除的是最后一个
else
q->next=p->next;
break;
}
else {
q=p;p=p->next; j++;
}//找出需要删除的学生信息,删除
}
void checkInfo(struct info *head)//通过输入学号,查看该学生的基本信息
{
long num;
struct info *p1;
p1=(struct info *)malloc(sizeof(struct info));
printf("输入要查看的学生学号:");scanf("%ld",&num);
for(p1=head;;p1=p1->next)
{
if(p1->no==num){
printf("学号\t\t姓名\t性别\t专业\t\t数学\t英语\tc语言\n");
printf("%ld\t\t%s\t%s\t%s\t\t%d\t%d\t%d\n",num,p1->name,p1->sex,p1->major,p1->cj.math,p1->cj.english,p1->cj.cLanguage);
break;}
}
}
void countScore(struct info *head)//统计每个学生的平均分,并按从高到低排序
{
struct info *p, *q,*p1;
float t;
p = head->next ;
while(p)
{
q = p->next;
while (q)
{
if (p->average<q->average)
{
t = p->average;
p->average = q->average;
q->average = t;
}
q = q->next;
}
p =p->next;
}//将平均分从高到低排序
printf("学号\t\t姓名\t性别\t专业\t\t平均分\n");
for(p1=head;;p1=p1->next)
{
printf("%ld\t\t%s\t%s\t%s\t\t%f\n",p1->no,p1->name,p1->sex,p1->major,p1->average);
}//打印出结果
}