链表实现学生学籍管理系统.docx
《链表实现学生学籍管理系统.docx》由会员分享,可在线阅读,更多相关《链表实现学生学籍管理系统.docx(36页珍藏版)》请在冰豆网上搜索。
链表实现学生学籍管理系统
#include
#include
#include
#defineN15//学号位数
#defineM15//姓名字节数
#defineL4//成绩的科数
intaa=0;
//记录筛选时打开的文
voidprintf_(structstu*);//输出单个的学生数据
structstu*scanf1_();//接收单个的学生数据,返回指针,
structstu*scanf_();//得到学生的数据,并放入到链表中
voidprint_(structstu*);//输出链表中的学生信息
structstu*num_paixu(structstu*);//用链表给学生排序
voidchaxun(structstu*);//根据学生的学号查询学生的信息,并把学生的数据输出
structstu*charu(structstu*);//将学生的数据插入到顺序排放的链表中,并且插入后也是顺序排放的。
structstu*shanchu(structstu*);//删除数据
voidxiugai(structstu*);//修改学生的信息。
voidfprint_(structstu*);//把数据写入到文件
intto_ji(structstu*);//统计学生的总人数
intt_ji_tj(structstu*);//统计成绩在某一区间内的人数
structstu*ch_ji_paixu(structstu*);//按成绩排序,默认的是按总成绩排序
structs*shaixuan(structstu*);//筛选符合条件的数据,得到符合条件的结构体数据的指针。
voidshuchu_shai(structs*);//输出筛选出来的数据
voidfb_shu_shai(structs*);//将筛选出来的数据输入到文件中
voidavrage(structstu*head,float*);//计算平均成绩
voidfb_avrage(float*);//将平均成绩放在文件的最后面
//建立学生结构体
structstu
{
charnum[N];
charname[M];
intch_ji[L];
structstu*next;
};
//建立一个链表,存放学生结构体的指针
structs
{
structstu*p;
structs*ps;
};
voidmain()
{
inti,n,x=1,k=0;
floata[L]={0};
structstu*head=NULL;
structs*shead=NULL;
charch;
while(x)
{system("cls");
printf("*******************************************************************************\n");
printf("0---退出系统1---录入数据\n");
printf("2---保存文件3---按成绩排序\n");
printf("4---查看信息5---按学号排序\n");
printf("6---统计人数7---按条件筛选\n");
printf("8---查询信息9---显示筛选结果\n");
printf("10---插入数据11---保存筛选结果\n");
printf("12---删除数据13---计算平均成绩\n");
printf("14---修改数据15---保存平均成绩\n");
printf("16---按条件统计人数\n");
printf("*******************************************************************************\n");
scanf("%d",&n);
getchar();//有啥作用
switch(n)
{
case0:
x=0;break;
case1:
head=scanf_();break;
case2:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
fprint_(head);break;
case3:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
head=ch_ji_paixu(head);
break;
}
case4:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
print_(head);break;
case5:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
head=num_paixu(head);
printf("是否显示排序结果Y/N?
");
ch=getchar();getchar();
if(ch=='y'||ch=='Y')
{
printf("\n");
print_(head);
}
break;
}
case6:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
k=to_ji(head);
printf("总共有%3d名学生",k);
getchar();
break;
}
case7:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
shead=shaixuan(head);
if(shead!
=NULL&&shead->ps!
=NULL)
{
printf("是否显示筛选结果Y/N?
");
ch=getchar();
if(ch=='y'||ch=='Y')
{
printf("\n");
shuchu_shai(shead);
getchar();
}
}
break;
}
case8:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
chaxun(head);
getchar();
break;
}
case9:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
printf("\n");
shuchu_shai(shead);
getchar();
break;
}
case10:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
head=charu(head);break;
case11:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
fb_shu_shai(shead);
getchar();
break;
}
case12:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
head=shanchu(head);
break;
}
case13:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
avrage(head,a);
printf("平均值计算成功!
\n是否显示平均成绩Y/N?
");
ch=getchar();
if(ch=='y'||ch=='Y')
{
printf("\n语文数学英语总成绩\n");
printf("%-8.2f%-8.2f%-8.2f%-8.2f",a[0],a[1],a[2],a[L-1]);
getchar();
}
break;
}
case14:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
xiugai(head);
break;
}
case15:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
fb_avrage(a);
printf("平均值保存成功!
");
getchar();
break;
}
case16:
if(head==NULL||head->next==NULL)
{
printf("请先录入学生的数据!
");
getchar();
break;
}
else
{
k=t_ji_tj(head);
if(k>0)
{
printf("符合条件的有%3d名学生!
",k);
getchar();
}
elseif(k==0)
{
printf("没有符合条件的学生!
");
getchar();
}
elseif(k==-2)
getchar();
break;
}
default:
printf("输入有误,请重新输入!
");
getchar();
break;
}
}
}
//输出单个的学生数据
voidprintf_(structstu*p0)
{
inti;
printf("学号:
");
puts(p0->num);
printf("姓名:
");
puts(p0->name);
printf("语文数学英语总成绩\n");
for(i=0;iprintf("%-8d",p0->ch_ji[i]);
printf("\n");
}
//接收单个的学生数据,返回指针,
structstu*scanf1_()
{
inti,sum=0;
structstu*p0;
p0=(structstu*)malloc(sizeof(structstu));
printf("请输入学生的学号:
");
gets(p0->num);
printf("请输入学生的姓名:
");
gets(p0->name);
printf("请输入学生的三科成绩(语文、数学、英语):
");
for(i=0;i{
scanf("%d",&p0->ch_ji[i]);
sum+=p0->ch_ji[i];
}
getchar();
p0->ch_ji[L-1]=sum;
returnp0;
}
//得到学生的数据,并放入到链表中
structstu*scanf_()
{
structstu*p1,*p2,*head;
inti,sum=0,n=0;
printf("注意:
当学生学号为0时输入结束\n\n");
p1=(structstu*)malloc(sizeof(structstu));/*得到学生信息*/
head=p2=p1;
do
{printf("请输入学生的学号:
");
gets(p1->num);
if(strcmp(p1->num,"0")==0)
break;
printf("请输入学生的姓名:
");
gets(p1->name);
printf("请输入学生的三科成绩(语文、数学、英语):
");
for(i=0;i{
scanf("%d",&p1->ch_ji[i]);
sum+=p1->ch_ji[i];
}
getchar();
printf("\n");
p1->ch_ji[L-1]=sum;
sum=0;
p1=(structstu*)malloc(sizeof(structstu));
p2->next=p1;
p2=p1;
n++;
}while
(1);
p1->next=NULL;
printf("成绩输入结束!
\n");
getchar();/*学生的数据被放在链表中*/
returnhead;
}
/*输出链表中的学生信息*/
voidprint_(structstu*head)
{
inti;
structstu*p1,*p2;
p1=p2=head;
while(p1->next!
=NULL)
{
printf("学号:
");
puts(p1->num);
printf("姓名:
");
puts(p1->name);
printf("语文数学英语总成绩\n");
for(i=0;iprintf("%-8d",p1->ch_ji[i]);
printf("\n");
p1=p2->next;
p2=p1;
}
getchar();
}
/*用链表给学生排序*/
structstu*num_paixu(structstu*head)
{
structstu*p1,*p2,*p3,*p4,*p5,*p6,*p7;
intx=1;
for(p1=head;p1->next!
=NULL;p4=p1,p1=p1->next)
{
p3=p1;
for(p2=p1->next,p5=p7=p2;p2->next!
=NULL;p7=p2,p2=p2->next)
{
if(strcmp(p3->num,p2->num)>0)
{
p3=p2;
p5=p7;
}
}
if(p3!
=p1)
{
if(x&&p1==head)
{
p6=p1->next;
p1->next=p3->next;
p3->next=p6;
p5->next=p1;
head=p3;
p1=p3;
x=0;
}
else
{
p6=p1->next;
p1->next=p3->next;
p3->next=p6;
p4->next=p3;
p5->next=p1;
p1=p3;
}
}
}
printf("排序成功!
\n");
returnhead;
}
//根据学生的学号查询学生的信息,并把学生的数据输出
voidchaxun(structstu*head)
{
chara[N];
structstu*p1;
printf("请输入要查询的学号:
");
gets(a);
p1=head;
while(p1->next!
=NULL)
{
if(strcmp(p1->num,a)==0)
break;
p1=p1->next;
}
if(p1->next==NULL)
printf("没有找到学号为%s的学生!
\n",a);
else
{
printf("要查询的学生信息如下:
\n\n");
printf_(p1);
}
}
//将学生的数据插入到顺序排放的链表中,并且插入后也是顺序排放的。
structstu*charu(structstu*head)
{
structstu*p1,*p2,*p3;
p1=scanf1_();
p2=head;
p3=p2;
while((strcmp(p2->num,p1->num)<0)&&p2->next!
=NULL)
{
p3=p2;
p2=p2->next;
}
if(p2==head)
{
p1->next=head;
head=p1;
}
else
{
p3->next=p1;
p1->next=p2;
}
printf("插入成功!
\n");
getchar();
returnhead;
}
//删除数据
structstu*shanchu(structstu*head)
{
chara[N];
structstu*p1,*p2,*p3;
printf("请输入要删除的学生的学号:
");
gets(a);
p1=head;
p2=p1;
while((strcmp(p2->num,a)!
=0)&&p2->next!
=NULL)
{
p3=p2;
p2=p2->next;
}
if(p2->next==NULL)
printf("没有找到要删除的数据!
\n");
elseif(p2==head)
{
head=p2->next;
printf("删除成功!
\n");
}
else
{
p3->next=p2->next;
printf("删除成功!
\n");
}
getchar();
returnhead;
}
//修改学生的信息。
voidxiugai(structstu*head)
{
chara[N];
structstu*p1;
inti,k;
printf("输入要修改的学生的学号");
gets(a);
p1=head;
while(p1->next!
=NULL)
{
if(strcmp(p1->num,a)==0)
break;
p1=p1->next;
}
if(p1->next==NULL)
{
printf("没有要找的学生信息!
\n");
getchar();
}
else
{
printf("***********************************\n");
printf("*0---放弃修改*\n");
printf("*1---修改学号*\n");
printf("*2---修改姓名*\n");
printf("*3---修改成绩*\n");
printf("*4---修改全部*\n");
printf("***********************************\n");
scanf("%d",&k);
getchar();
switch(k)
{
case0:
break;
case1:
printf("请输入新学号:
");
gets(p1->num);
printf("修改成功!
");
getchar();