超好的学生成绩管理系统链表实现的代码含详细的注释哦.docx
《超好的学生成绩管理系统链表实现的代码含详细的注释哦.docx》由会员分享,可在线阅读,更多相关《超好的学生成绩管理系统链表实现的代码含详细的注释哦.docx(21页珍藏版)》请在冰豆网上搜索。
超好的学生成绩管理系统链表实现的代码含详细的注释哦
#include
#include
#include
//单链表的定义
//数据元素的类型
typedefstructLNode
{//声明结点的类型和指向结点的指针类型//
intstuid;
charname[20];
floatenglish;
floatmath;
floatdatabase;
floatsum;
floataverage;
structLNode*next;//指示结点地址的指针//
}LNode,*LinkList;
//函数1.输入学生信息,逆向建立单链表
LinkListInput()
{
inti,n;
LinkListL,p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//建立一带头结点的空单链表//
//单链表初始化结束
printf("请输入要输入的学生个数:
\n");
scanf("%2d",&n);
//逆序建立
for(i=n;i>0;i--)
{
printf("**************************************\n");
printf("**请输入第%d个学生的信息**\n",i);
printf("**************************************\n");
p=(LinkList)malloc(sizeof(LNode));//生成新结点//
printf("请输入学生的学号:
");
scanf("%d",&p->stuid);
printf("请输入学生的姓名:
");
scanf("%s",p->name);
printf("请输入学生的英语成绩:
");
scanf("%f",&p->english);
printf("请输入学生的高数成绩:
");
scanf("%f",&p->math);
printf("请输入学生的数据结构成绩:
");
scanf("%f",&p->database);
p->sum=p->english+p->math+p->database;
p->average=p->sum/3;
p->next=L->next;
L->next=p;//把新结点插入到链表头部
}
returnL;
}
//函数2.显示学生信息
voidDisplay(LinkListL)
{
LinkListp;
p=L->next;//L为头指针p指向第一个结点
if(L==NULL)
printf("请先输入数据\n");
else{
printf("所有同学信息如下:
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");
while(p)
{
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",p->stuid,p->name,p->sum,p->average,p->english,p->math,p->database);
p=p->next;
}
}
}
//函数3.插入单个学生到表头
voidInsert(LinkListL)
{
LinkListp;
p=(LinkList)malloc(sizeof(LNode));//p指向要插入的结点
printf("请输入学生的学号:
");
scanf("%d",&p->stuid);
printf("请输入学生的姓名:
");
scanf("%s",p->name);
printf("请输入学生的英语成绩:
");
scanf("%f",&p->english);
printf("请输入学生的高数成绩:
");
scanf("%f",&p->math);
printf("请输入学生的数据结构成绩:
");
scanf("%f",&p->database);
p->sum=p->english+p->math+p->database;
p->average=p->sum/3;
p->next=L->next;//将p插入L中
L->next=p;
printf("插入成功!
");
}
//函数4.删除某个学生
//要知道要删除的这个结点的前一个结点的位置
voidDelete(LinkListL)
{
LinkListp,q;
intnum,ch;
chars[20];
if(L==NULL)
printf("请先输入数据\n");
else{
p=L;//L是头结点的头指针,最后p指向要删除的结点的前一个位置
q=p->next;//q指向p的下一个结点,即最后指向要删除的结点
printf("1.按姓名删除\n2.按学号删除\n请选择:
");
scanf("%d",&ch);
if(ch==1)
{
printf("请输入姓名:
");
scanf("%s",s);
while(strcmp(q->name,s)!
=0&&q->next!
=NULL){
p=q;
q=q->next;
}
if(strcmp(q->name,s)==0)//q指向的结点要被删除,p指向要删除的结点的前一个位置
{
p->next=q->next;
printf("被删除学生的信息如下:
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",q->stuid,q->name,q->sum,q->average,q->english,q->math,q->database);
free(q);//释放要删除的结点q
}
else
printf("没有该学生的信息\n");
}//按姓名删除
else
{
printf("请输入要删除学生的学号:
");
scanf("%10d",&num);
while(q->stuid!
=num&&q->next!
=NULL){
p=q;
q=q->next;
}
if(q->stuid==num)//q指向的结点要被删除,p指向要删除的结点的前一个位置
{p->next=q->next;
printf("被删除学生的信息如下:
\n");
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",q->stuid,q->name,q->sum,q->average,q->english,q->math,q->database);
free(q);//释放要删除的结点q
}
else
printf("没有该学生的信息\n");
}//按学号删除
}//有学生信息
}
//函数5.顺序查找某个学生
voidSearch(LinkListL)
{
LinkListp;
intnum,ch;
charsn[20];
p=L->next;
if(!
L)
printf("请先输入数据\n");
else
{
printf("1.按学号查找\n2.按姓名查找\n请选择:
");
scanf("%d",&ch);
if(ch==1){
printf("请输入要查找学生的学号:
\n");
scanf("%10d",&num);
while(p&&p->stuid!
=num)
p=p->next;
if(p->stuid==num)
{
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",p->stuid,p->name,p->sum,p->average,p->english,p->math,p->database);
}
else
printf("没有该学生的信息\n");
}//按学号查找ch==1
else
{
printf("请输入要查找学生的姓名:
\n");
scanf("%s",sn);
while(p&&strcmp(p->name,sn)!
=0)
p=p->next;
if(strcmp(p->name,sn)==0)
{
printf("学号\t姓名\t总分\t平均分\t英语成绩\t高数成绩\t数据结构成绩\n");
printf("%d\t%s\t%.2f\t%.2f\t%.2f\t\t%.2f\t\t%.2f\n",p->stuid,p->name,p->sum,p->average,p->english,p->math,p->database);
}
else
printf("没有该学生的信息\n");
}//按姓名查找ch==2
}//有数据
}
//函数6.显示各科最高分
voidMax(LinkListL)
{
LinkListp1=L->next,p2=L->next,p3=L->next;
floatmax1=0,max2=0,max3=0;
printf("************************************************\n");
printf("*显示各科最高分*\n");
printf("************************************************\n");
//英语最高分
for(p1;p1->next!
=NULL;p1=p1->next)
if(p1->english>p1->next->english)
max1=p1->english;
else
max1=p1->next->english;
//数学最高分
for(p2;p2->next!
=NULL;p2=p2->next)
if(p2->math>p2->next->math)
max2=p2->math;
else
max2=p2->next->math;
//数据结构最高分
for(p3;p3->next!
=NULL;p3=p3->next)
if(p3->database>p3->next->database)
max3=p3->database;
else
max3=p3->next->database;
printf("英语:
\t%6.1f\n",max1);
printf("高数:
\t%6.1f\n",max2);
printf("数据结构:
\t%6.1f\n",max3);
}
//函数7.各科平均分
voidAverage(LinkListL)
{
floatave1,ave2,ave3,i=0;
floatenglish1=0,math1=0,database1=0;
LinkListp;
p=L->next;
if(!
L)
printf("请先输入数据");
while(p!
=NULL)
{
i++;
english1=english1+p->english;
math1=math1+p->math;
database1=database1+p->database;
p=p->next;
}
ave1=english1/i;
ave2=math1/i;
ave3=database1/i;
printf("************************************************\n");
printf("*各科平均分的统计*\n");
printf("************************************************\n\n");
printf("\t\t英语\t高数\t数据结构\n");
printf("\t平均分:
%6.1f\t%6.1f\t%6.1f\n",ave1,ave2,ave3);
}
//函数0.退出
voidtuichu(){
printf("\t**********谢谢使用**********\n");
exit(0);
}
//函数8.排序
voidSort(LinkListL){
LinkListp,q,r;
intch1,ch2,dd1,i,j,count=0;
floatdd2;
if(!
L)
printf("请先输入数据");
else{
printf("1.直接插入排序\t2.冒泡排序\t3.直接选择排序\n请选择:
");
scanf("%d",&ch1);
switch(ch1){
case1:
//L是带头结点的单链表
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结构成绩排序\t5.按总分排序\n请选择:
");
scanf("%d",&ch2);
switch(ch2){
case1:
p=L->next->next;//p指向第一结点的后继
L->next->next=NULL;//直接插入排序,第一元素有序,从第二元素起依次插入
while(p!
=NULL){
r=p->next;//暂存p的后继
q=L;
while(q->next!
=NULL&&q->next->stuidstuid)//查找插入位置
q=q->next;//将P结点链入链表
p->next=q->next;
q->next=p;
p=r;
}
break;
case2:
p=L->next->next;
L->next->next=NULL;
while(p!
=NULL){
r=p->next;
q=L;
while(q->next!
=NULL&&q->next->englishenglish)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
break;
case3:
p=L->next->next;
L->next->next=NULL;
while(p!
=NULL){
r=p->next;
q=L;
while(q->next!
=NULL&&q->next->mathmath)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
break;
case4:
p=L->next->next;
L->next->next=NULL;
while(p!
=NULL){
r=p->next;
q=L;
while(q->next!
=NULL&&q->next->databasedatabase)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
break;
case5:
p=L->next->next;
L->next->next=NULL;
while(p!
=NULL){
r=p->next;
q=L;
while(q->next!
=NULL&&q->next->sumsum)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
break;
}//switch(ch2)
break;
case2:
p=L->next;
while(p){
count++;
p=p->next;
}
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结构成绩排序\t5.按总分排序\n请选择:
");
scanf("%d",&ch2);
switch(ch2){
case1:
for(i=0;i{
p=L->next;
for(j=0;j{
if(p->stuid>p->next->stuid)
{
dd1=p->stuid;
p->stuid=p->next->stuid;
p->next->stuid=dd1;
}
p=p->next;
}
}
break;
case2:
for(i=0;i{
p=L->next;
for(j=0;j{
if(p->english>p->next->english)
{
dd2=p->english;
p->english=p->next->english;
p->next->english=dd2;
}
p=p->next;
}
}
break;
case3:
for(i=0;i{
p=L->next;
for(j=0;j{
if(p->math>p->next->math)
{
dd2=p->math;
p->math=p->next->math;
p->next->math=dd2;
}
p=p->next;
}
}
break;
case4:
for(i=0;i{
p=L->next;
for(j=0;j{
if(p->database>p->next->database)
{
dd2=p->database;
p->database=p->next->database;
p->next->database=dd2;
}
p=p->next;
}
}
break;
case5:
for(i=0;i{
p=L->next;
for(j=0;j{
if(p->sum>p->next->sum)
{
dd2=p->sum;
p->sum=p->next->sum;
p->next->sum=dd2;
}
p=p->next;
}
}
break;
}//switch(ch2)
break;
case3:
//直接选择排序一趟找出一个关键字最小的结点,其数据和当前结点进行交换;
//若要交换指针,需记下当前结点和最小结点的前驱指针
p=L->next;
printf("1.按学号排序\n2.按英语成绩排序\t3.按高数成绩排序\n4.按数据结构成绩排序\t5.按总分排序\n请选择:
");
scanf("%d",&ch2);
switch(ch2){
case1:
while(p){
q=p->next;
r=p;//设r是指向关键字最小的结点的指针
while(q)
{
if(q->stuidstuid)
r=q;
q=q->next;
}
if(r!
=p)
{
dd1=r->stuid;
r->stuid=q->stuid;
q->stuid=dd1;
}
p=p->next;
}//while(p)
break;
case2:
while(p){
q=p->next;
r=p;//设r是指向关键字最小的结点的指针
while(q)
{
if(q->englishenglish)
r=q;
q=q->next;
}
if(r!
=p)
{
dd2=r->english;