这份代码,仅仅必须在VC 6.0上运行,如果用Dev C++的小伙伴,需要吧除main函数之外的函数名,进行在库函数一下进行定义即可,本人(太懒了)就不在此进行修改了,结构有点乱,是之前老师给的样板,同时希望大家学到一些东西!
#include<stdio.h>
#include<string.h>
//结构体类型定义
struct student
{ long num; //学号
int score[3]; //三门课成绩
float aver; //平均分
char name[20]; //姓名
struct student *next; //指针域,指向链表的下一个结点
};
typedef struct student STU; //为struct student结构体类型定义别名STU
/*输入学生学号和各课成绩,并计算平均分*/
STU *insert(STU *head)
{STU *new,*p,*q;
int j;
/*输入数据生成一个新结点*/
new=(STU *)malloc(sizeof(STU));
printf("\n姓名:"); scanf("%s",new->name);
printf("\n学号:"); scanf("%ld",&new->num);
printf("\n英语 高数 计算机:\n");
new->aver=0;
for(j=0;j<3;j++)
{scanf("%d",&new->score[j]);
new->aver+=new->score[j];
}
new->aver/=3;
/*新结点按照学号从小到大插入链表*/
p=head;
if(head==NULL) /*链表是空链表*/
{head=new;
new->next=NULL;
}
else
{/*寻找插入位置*/
while((p->next!=NULL)&&(p->num<new->num))
{q=p; p=p->next;}
if(p->num>=new->num)
{if(head==p) /*链表非空,插入到第一个结点前*/
{new->next=head; head=new;}
else /*链表非空,插入到链表中间*/
{q->next=new; new->next=p;}
}
else /*链表非空,插入到链表末尾*/
{p->next=new; new->next=NULL;}
}
return(head);
}
/*按照输入学生的学号查找各科成绩和平均分*/
void search_num(STU *head)
{STU *p;
long in_num;
printf("\n请输入要查询的学生学号:");
scanf("%ld",&in_num);
p=head;
if(head==NULL) /*链表是空链表*/
printf("无学生数据!\n");
while((p->next!=NULL)&&(p->num!=in_num)) /*寻找结点位置*/
p=p->next;
if(in_num==p->num)
printf("\n姓名:%s,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
p->name,p->score[0],p->score[1],p->score[2],p->aver);
else
printf("查无此学号\n");
}
/*按照输入学生的姓名查找各科成绩和平均分*/
void search_name(STU *head)
{STU *p;
char in_name[20];
printf("\n请输入要查询的学生姓名:");
scanf("%s",in_name);
p=head;
if(head==NULL) /*链表是空链表*/
printf("无学生数据!\n");
while((p->next!=NULL)&&(strcmp(p->name,in_name)!=0)) /*寻找结点位置*/
p=p->next;
if((strcmp(p->name,in_name)==0))
printf("\n学号:%ld,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
p->num,p->score[0],p->score[1],p->score[2],p->aver);
else
printf("查无此姓名%s!\n",in_name);
}
/*查找平均分最高的学生姓名、学号、平均分*/
void search_max(STU *head)
{STU *p=head;
long high_num;
float max=0;
while(p!=NULL) /*寻找平均分最高的学生学号*/
{if(p->aver>max)
{max=p->aver; high_num=p->num;}
p=p->next;
}
/*寻找平均分最高的学生位置*/
p=head;
while((p->next!=NULL)&&(p->num!=high_num))
p=p->next;
printf("\n姓名:%s,学号:%ld,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
p->name,p->num,p->score[0],p->score[1],p->score[2],p->aver);
}
/*查找平均分不及格的学生姓名、学号、平均分*/
void search_fail(STU *head)
{STU *p=head;
while(p!=NULL)
{if(p->aver<60)
printf("\n姓名:%s,学号:%ld,英语成绩:%2d,高数成绩:%2d,计算机成绩:%2d,平均成绩:%4.1f\n\n",
p->name,p->num,p->score[0],p->score[1],p->score[2],p->aver);
p=p->next;
}
}
//主菜单的查找功能
void search(STU *head)
{int x; /*x为菜单的选择*/
while(1)
{printf("\n\n\t\t 查询子菜单\n");
printf("\t\t============\n");
printf("\t\t1.按学生学号查询成绩\n");
printf("\t\t2.按学生姓名查询成绩\n");
printf("\t\t3.查询平均分最高的学生姓名\n");
printf("\t\t4.查询平均分不及格的学生姓名\n");
printf("\t\t0.返回主菜单\n");
printf("\t\t============\n");
printf("\t请选择(0~4):\n"); scanf("%d",&x);
switch(x)
{case 1:search_num(head); break;
case 2:search_name(head); break;
case 3:search_max(head); break;
case 4:search_fail(head); break;
case 0:break;
default:printf("\n输入错误,请重新输入!");
}
if(x==0) break;
}
}
/*按照输入学生的学号删除记录*/
void *dele_num(STU *head)
{STU *p,*q;
long in_num;
printf("\n请输入要删除的学生学号:");
scanf("%ld",&in_num);
p=head;
if(head==NULL) /*链表是空链表*/
{printf("无学生数据!\n");
return(head); }
while((p->next!=NULL)&&(p->num!=in_num)) /*寻找删除结点位置*/
{q=p; p=p->next;}
if(p->num==in_num)
{if(head==p) head=p->next; /*删除链表第一个结点*/
else q->next=p->next;/*删除链表结点*/
free(p);
printf("已删除\n");
}
else
printf("数据库中无此学生学号!\n");
return(head);
}
/*按照输入学生的姓名删除记录*/
STU *dele_name(STU *head)
{STU *p,*q;
char in_name[20];
printf("\n请输入要删除的学生姓名:");
scanf("%s",in_name);
p=head;
if(head==NULL) /*链表是空链表*/
{printf("无学生数据!\n");
return(head); }
while((p->next!=NULL)&&(strcmp(p->name,in_name)!=0)) /*寻找删除结点位置*/
{q=p; p=p->next;}
if(strcmp(p->name,in_name)==0)
{if(head==p) head=p->next; /*删除链表第一个结点*/
else q->next=p->next;/*删除链表结点*/
free(p);
printf("已删除\n");
}
else
printf("数据库中无此学生姓名!\n");
return(head);
}
//主菜单的删除功能
STU *dele(STU *head)
{int x; /*x为菜单的选择*/
while(1)
{printf("\n\n\t\t 删除子菜单\n");
printf("\t\t============\n");
printf("\t\t1.按学生学号删除记录\n");
printf("\t\t2.按学生姓名删除记录\n");
printf("\t\t0.返回主菜单\n");
printf("\t\t============\n");
printf("\t请选择(0~2):\n"); scanf("%d",&x);
switch(x)
{case 1:head=dele_num(head); break;
case 2:head=dele_name(head); break;
default:printf("\n输入错误,请重新输入!");
}
if(x==0) break;
}
return(head);
}
/*按照输入学生的学号修改记录*/
STU *modi_num(STU *head)
{STU *p;
long in_num; int j;
printf("\n请输入要修改的学生学号:");
scanf("%ld",&in_num);
p=head;
if(head==NULL) /*链表是空链表*/
{printf("无学生数据!\n");
return(head); }
while((p->next!=NULL)&&(p->num!=in_num)) /*寻找要修改结点的位置*/
p=p->next;
if(p->num==in_num)
{printf("\n姓名:"); scanf("%s",p->name);
printf("\n英语 高数 计算机:\n");
p->aver=0;
for(j=0;j<3;j++)
{scanf("%d",&p->score[j]);
p->aver+=p->score[j]; }
p->aver/=3;
}
else
printf("数据库中无此学生学号!\n");
return(head);
}
/*按照输入学生的姓名修改记录*/
STU *modi_name(STU *head)
{STU *p;
char in_name[20]; int j;
printf("\n请输入要修改的学生姓名:");
scanf("%s",in_name);
p=head;
if(head==NULL) /*链表是空链表*/
{printf("无学生数据!\n");
return(head); }
while((p->next!=NULL)&&(strcmp(p->name,in_name)!=0)) /*寻找要修改结点的位置*/
p=p->next;
if((strcmp(p->name,in_name)==0))
{printf("\n姓名:"); scanf("%s",p->name);
printf("\n英语 高数 计算机:\n");
p->aver=0;
for(j=0;j<3;j++)
{scanf("%d",&p->score[j]);
p->aver+=p->score[j]; }
p->aver/=3;
}
else
printf("数据库中无此学生学号!\n");
return(head);
}
//主菜单的修改功能
STU *modi(STU *head)
{int x; /*x为菜单的选择*/
while(1)
{printf("\n\n\t\t 修改成绩子菜单\n");
printf("\t\t============\n");
printf("\t\t1.按学生学号修改记录\n");
printf("\t\t2.按学生姓名修改记录\n");
printf("\t\t0.返回主菜单\n");
printf("\t\t============\n");
printf("说明:若修改学号,请选择删除该学号,再输入\n");
printf("\t请选择(0~2):\n"); scanf("%d",&x);
switch(x)
{case 1:head=modi_num(head); break;
case 2:head=modi_name(head); break;
default:printf("\n输入错误,请重新输入!");
}
if(x==0) break;
}
return(head);
}
/*按照学号从小到大顺序显示输出*/
void output(STU *head)
{STU *p=head;
if(head==NULL) /*链表是空链表*/
printf("无学生数据!\n");
else
{printf("\n 学号\t\t姓名\t英语\t高数\t计算机\t平均分\n");
while(p!=NULL)
{printf("%8ld%12s%8d%8d%8d%8.1f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->aver);
p=p->next; }
}
}
//主函数
void main()
{int x; /*x为菜单的选择*/
STU *head=NULL;
while(1)
{printf("\n\t\t\t主菜单\n");
printf("\t==================================\n");
printf("\t\t1. 输入学生成绩\n");
printf("\t\t2. 查询学生成绩\n");
printf("\t\t3. 删除学生成绩\n");
printf("\t\t4. 修改学生成绩\n");
printf("\t\t5. 打印输出成绩\n");
printf("\t\t0. 退出系统\n");
printf("\t==================================\n");
printf("\t请选择(0~5):");
scanf("%d",&x);
switch(x)
{case 1:head=insert(head); break;
case 2:search(head); break;
case 3:head=dele(head); break;
case 4:head=modi(head); break;
case 5:output(head); break;
case 0:printf("谢谢使用!");break;
default:printf("\n输入错误,请重新输入!"); break;
}
if(x==0) break;
}
}