基础功能:
使用链表
使用结构体
对学生信息的增删改查
按姓名或者学号进行学生成绩的排序
#include
#include
#include
#define M 2
#define N 4
typedef struct score//定义成绩结构体
{
int math;//数学
int c_language;//c语言
int english;//英语
double ave;//平均分
int total_sum;//总分
}SCORE;
typedef struct stu
{
char id[20];//学号
char name [10];//姓名
char sex[20];//性别
char pro[20];//专业
int year;//入学年份
SCORE stu_score;//学生成绩
char stu_lesson[N][50];//学生选课
}STU;
typedef struct list
{
STU data;
struct list *next;
}LIST;//创建链表结构体
LIST *Creat_List(STU s[]);//链表的创建
int Stu_Entry(STU stu[]);//学生信息的录入
int Score_Entry(STU score[]);//学生成绩的录入
void S_score(LIST*head);//利用链表进行成绩的输出
void infor_show(LIST*head);//利用链表对学生信息进行输出
void S_sort(STU s[],int flag);//利用结构体进行排序
SCORE Score_search(char *s,LIST *p,int flag);//成绩的查询
LIST *Delet_Score(char*s,LIST*tr,int flag);//成绩的删除
LIST *Delet_infor(char*st,LIST *ht,int flag);//学生记录的删除
LIST *Re_score(char *sr,SCORE R_score,LIST *h,int flag);//成绩修改
void Show_infor(char *S_s,LIST*h,int flag);//学生信息的查询
int Elect_les(STU lesson[]);//学生选课
LIST* Insert_infor(LIST *in_infor );//学生信息的添加
void main()
{
printf("\t\t\t欢迎进入学生信息管理系统\n");
system("color 9");
int choice;//输入你的选择
char user[23];//输入用户名
char key[20];//输入密码
STU stu[M];//结构体数组
LIST *head;//链表的头结点
head=Creat_List(stu);
printf("请输入用户名:\n");
scanf("%s",user);
printf("请输入密码:\n");
scanf("%s",key);
printf("*******************************\n");
printf("* 1---信息录入 *\n");
printf("* 2---成绩录入 *\n");
printf("* 3---成绩输出 *\n");
printf("* 4---成绩排序 *\n");
printf("* 5---成绩查询 *\n");
printf("* 6---成绩修改 *\n");
printf("* 7---信息添加 *\n");
printf("* 8---信息删除 *\n");
printf("* 9---成绩删除 *\n");
printf("* 10--信息查询 *\n");
printf("* 11--信息输出 *\n");
printf("* 12--学生选课 *\n");
printf("* 13--退出程序 *\n");
printf("*******************************\n");
if(strcmp(user,"admin")==0&&strcmp(key,"123456")==0)
{
printf("请输入你的选择:\n");
while(scanf("%d",&choice)!=EOF)
{
system("cls");
printf("*******************************\n");
printf("* 1---信息录入 *\n");
printf("* 2---成绩录入 *\n");
printf("* 3---成绩输出 *\n");
printf("* 4---成绩排序 *\n");
printf("* 5---成绩查询 *\n");
printf("* 6---成绩删除 *\n");
printf("* 7---信息添加 *\n");
printf("* 8---信息删除 *\n");
printf("* 9---成绩修改 *\n");
printf("* 10--信息查询 *\n");
printf("* 11--信息输出 *\n");
printf("* 12--学生选课 *\n");
printf("* 13--退出程序 *\n");
printf("*******************************\n");
switch(choice)
{
case 1:{
printf("请录入学生的信息:\n");
if(Stu_Entry(stu))
printf("信息录入完成\n");
else
printf("信息录入失败\n");
system("pause");break;
}
case 2:{
printf("请录入每位学生对应的成绩:\n");
if(Score_Entry(stu))
printf("学生成绩录入完成\n");
else
printf("学生成绩录入失败\n");
system("pause");break;
}
case 3:{
printf("成绩的输出为:\n");
S_score(Creat_List(stu));
system("pause");break;
}
case 4:{
int choice;
printf("请输入排序的方式(1-平均分排序 2-总分排序)\n");
scanf("%d",&choice);
printf("成绩排序的结果为:\n");
S_sort(stu,choice);
S_score(Creat_List(stu));
system("pause");break;
system("pause");break;
}
case 5:{
SCORE result;
char name_search[20];
char id_search[20];
int choice;
printf("请输入查询方式(1-学号查询 2-姓名查询):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{ printf("请输入需要查询的学生的学号:\n");
scanf("%s",id_search);
printf("学号为%s学生的数学 c语言 英语成绩 总分以及平均分为:\n",id_search);
result= Score_search(id_search,Creat_List(stu),1);
printf("查询的结果为:\n");
printf("%d %d %d %d %.1lf\n",result.math,
result.c_language,result.english,result.total_sum,result.ave);
break;
}
case 2:{
printf("请输入需要查询的学生的姓名:\n");
scanf("%s",name_search);
printf("学生%s的数学 c语言 英语成绩 总分以及平均分为:\n",name_search);
result= Score_search(id_search,Creat_List(stu),2);
printf("查询的结果为:\n");
printf("%d %d %d %d %.1lf\n",result.math,
result.c_language,result.english,result.total_sum,result.ave);
break;
}
}
system("pause");break;
}
case 6: {
char id[20];//需要查询学号
char name[20];//需要查询的姓名
int choice;//输入你的选择
printf("请输入查询方式(1-学号查询 2-姓名查询):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("请输入要删除成绩学生的学号:\n");
scanf("%s",id);
if(Delet_Score(id,Creat_List(stu),1)!=NULL)
{
printf("成绩删除成功!\n");
S_score(Delet_Score(id,Creat_List(stu),1));
}
else
printf("成绩删除失败!\n");
break;
}
case 2:{
printf("请输入要删除信息学生的姓名:\n");
scanf("%s",name);
printf("信息删除后的结果为:\n");
if(Delet_Score(name,Creat_List(stu),2)!=NULL)
{
printf("成绩删除成功!\n");
S_score(Delet_Score(name,Creat_List(stu),2));
}
else
printf("成绩删除失败!\n");
break;
}
}
system("pause");break;
}
case 7:{
printf("插入后的结果为:\n");
S_score(Insert_infor(Creat_List(stu)));
system("pause");break;
}
case 8:{
printf("学生信息的删除:\n");
LIST *q;
char id[20];
char name[20];
int choice;
printf("请输入查询方式(1-学号查询 2-姓名查询):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("请输入要删除信息学生的学号:\n");
scanf("%s",id);
q=Delet_infor(id,Creat_List(stu),1);
if(q==NULL)
printf("信息删除失败\n");
else
{
printf("信息删除后的结果为:\n");
infor_show(q);
}
break;
}
case 2:{
printf("请输入要删除信息学生的姓名:\n");
scanf("%s",name);
printf("信息删除后的结果为:\n");
if(q==NULL)
printf("信息删除失败!\n");
else
{
printf("信息删除后的结果为:\n");
q=Delet_infor(name,Creat_List(stu),2);
}
infor_show(q);
break;
}
}
system("pause");break;
}
case 9:{
int choice;
SCORE re_score;
int sum=0;
char id[20];
char name[20];
printf("请输入要修改的英语 c语言 数学:\n");
scanf("%d %d %d",&re_score.english,&re_score.c_language,
&re_score.math);
sum=re_score.english+re_score.c_language+re_score.math;
re_score.ave=sum/3.0;
printf("请输入查询方式(1-学号查询 2-姓名查询):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{ printf("请输入要修改学生的学号:\n");
scanf("%s",id);
printf("成绩修改后的结果为:\n");
S_score(Re_score(id,re_score,Creat_List(stu),choice));
break;
}
case 2:{
printf("请输入要修改学生的姓名:\n");
scanf("%s",name);
printf("成绩修改后的结果为:\n");
S_score(Re_score(name,re_score,Creat_List(stu),choice));
break;
}
}
system("pause");break;
}
case 10:{
char id[20];
char name[20];
int choice;
printf("请输入查询方式(1-学号查询 2-姓名查询):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{ printf("请输入要查询学生的学号:\n");
scanf("%s",id);
Show_infor(id,Creat_List(stu),choice);
break;
}
case 2:{
printf("请输入要查询学生的姓名:\n");
scanf("%s",name);
Show_infor(id,Creat_List(stu),choice);
break;
}
}
system("pause");break;
}
case 11: {
printf("学生信息的输出结果为:\n");
infor_show(Creat_List(stu));
system("pause");break;
}
case 12:{ system("cls");
//system("pause");
printf("请输入选修课程中的四门课程:\n");
if( Elect_les(stu))
printf("学生选课成功!\n");
else
printf("学生选课失败!\n");
break;
}
case 13: {
printf("系统已经安全退出!!!");
exit(0);
system("pause");break;
}
default:{
printf("输入的选择有误,请重新输入你的选择:\n");
system("pause");break;
}
}
printf("可以选择继续录入也可以按ctrl+z退出\n");
}
}
else
{
system("cls");
printf("输入用户名或者密码错误,请退出后重新输入!\n");
}
}
LIST *Creat_List(STU *s)//PS:链表的建立
{
//尾插法进行建立链表
LIST *h,*p;
LIST*tail;
int i;
h=(LIST*)(malloc)(sizeof(LIST));
if(h==NULL)
return h;
else
tail=h;
for(i=0;idata=s[i];
tail->next=p;
tail=p;
tail->next=NULL;
}
}
//头插法进行创建链表
/* LIST*h,*p;
int i;
h=(LIST*)malloc(sizeof(LIST));
if(h==NULL)
return NULL;
else
h->next=NULL;
for(i=0;idata=s[i];
p->next=h->next;
h->next=p;
}
}*/
return h;
}
int Stu_Entry(STU stu[M])//PS:学生信息录入函数的封装
{
int i;
for(i=0;inext;
if(p==NULL)
{
printf("链表发生错误!!!\n");
return;
}
else
{
printf("HEAD->\n");
while(p!=NULL)
{
printf("%d-学号:%s学生的数学 c语言 英语成绩 总分以及平均分为:\n",count,p->data.id);
printf("%d %d %d %d %.1lf\n",p->data.stu_score.math,
p->data.stu_score.c_language,
p->data.stu_score.english,p->data.stu_score.total_sum,p->data.stu_score.ave);
p=p->next;
count++;
}
printf("->END\n");
}
}
void S_sort(STU s[],int flag)//PS:成绩的排序函数的封装 利用结构体
{
int i,j;
int k;
STU t;
if(flag==1)
{
for(i=0;idata.id,s)==0)
{
break;
}
p=p->next;
}
return (p->data.stu_score);*/
if(strcmp(p->data.id,s)==0&&flag==1)
return (p->data.stu_score);
else if(strcmp(p->data.name,s)==0&&flag==2)
{
return (p->data.stu_score);
}
else
return (Score_search(s,p->next,flag));//递归
}
}
LIST* Delet_Score(char* s,LIST *tr,int flag)//PS:删除成绩函数的封装
{
LIST *p;
p=tr->next;
if(p==NULL)
{
printf("链表有误,成绩删除失败!\n");
return 0;
}
else
{ if(flag==1)
{
while(p!=NULL)
{
if(strcmp(p->data.id,s)==0)
{
p->data.stu_score.c_language=0;
p->data.stu_score.english=0;
p->data.stu_score.math=0;
p->data.stu_score.total_sum=0;
p->data.stu_score.ave=0.0;
break;
}
p=p->next;
}
}
if(flag==2)
{
while(p!=NULL)
{
if(strcmp(p->data.id,s)==0)
{
p->data.stu_score.c_language=0;
p->data.stu_score.english=0;
p->data.stu_score.math=0;
p->data.stu_score.ave=0.0;
break;
}
p=p->next;
}
}
if(p==NULL)
return NULL;
else
return tr;
}
}
LIST* Delet_infor(char *st,LIST *ht,int flag)//PS:学生信息删除函数的封装
{
LIST*p;
LIST*tem;
p=ht->next;
if(p==NULL)
{
printf("链表错误!\n");
return NULL;
}
else
{
while(p!=NULL)
{
if(strcmp(p->data.id,st)==0&&flag==1)
{
tem=p;
break;
}
if(strcmp(p->data.name,st)==0&&flag==2)
{
tem=p;
break;
}
p=p->next;
}
while(strcmp(p->data.id,st)!=0&& p->next!=NULL)//PS:循环查找要删除的节点
{
tem=p;
p=p->next;
}
if( strcmp(p->data.id,st)==0)//找到了一个节点的num和num相等
{
if(p == ht->next)//找到的节点是头节点后面的一个节点
{
ht->next= p->next;
}
else
{
tem->next=p->next;
}
return ht;
}
else
return ht=NULL;
}
}
LIST *Re_score(char *sr,SCORE R_score,LIST *h,int flag)//PS:成绩修改函数的封装
{
//LIST *q;
//q=h;
LIST *p;
p=h->next;
if(p==NULL)
{
printf("链表发生错误,成绩修改失败!\n");
return p;
}
else
{
while(p!=NULL)
{
if(strcmp(p->data.id,sr)==0&&flag==1)
{
break;
}
if(strcmp(p->data.id,sr)==0&&flag==2)
{
break;
}
p=p->next;
}
p->data.stu_score= R_score;
}
return h;
}
void infor_show(LIST*h)//PS:学生信息全部输出函数的封装
{
LIST *p;
int i;
p=h->next;
if(p==NULL)
printf("链表发生错误!!!\n");
else
{
while(p!=NULL)
{ printf("学号%s的学生信息:\n",p->data.id);
printf("姓名:%s 性别:%s 专业:%s 入学年份:%d\n",p->data.name,p->data.sex,p->data.pro,p->data.year);
printf("该学生的选择的选修课为:\n");
for(i=0;idata.stu_lesson[i]);
p=p->next;
printf("\n");
}
}
}
void Show_infor(char *S_s,LIST*h,int flag)//PS:信息查询输出函数的封装
{
LIST*p;
p=h->next;
int i;
if(p==NULL)
printf("链表出现错误!!!\n");
else
{
while(p!=NULL)
{
if(strcmp(p->data.id,S_s)==0&&flag==1)
break;
if(strcmp(p->data.id,S_s)==0&&flag==2)
break;
p=p->next;
}
printf("学生的姓名 性别 专业 入学年份\n");
printf("%s %s %s %d\n",p->data.name,p->data.sex,p->data.pro,p->data.year);
printf("该学生的选择的选修课为:\n");
for(i=0;idata.stu_lesson[i]);
}
}
int Elect_les(STU lesson[])//PS:选修课的录入
{
int i,j;
printf("*******************************\n");
printf("* 1---语言文学 *\n");
printf("* 2---人文地理 *\n");
printf("* 3---思想政治 *\n");
printf("* 4---口才艺术 *\n");
printf("* 5---经济管理 *\n");
printf("* 6---国际贸易 *\n");
printf("* 7---职场礼仪 *\n");
printf("*******************************\n");
for(i=0;inext;
p=(LIST*)malloc(sizeof (LIST));
printf("请输入要填加的学生的学号 姓名 性别 专业 入学年份:\n");
scanf("%s %s %s %s %d", p->data.id, p->data.name, p->data.sex,
p->data.pro,&p->data.year);
printf("请输入要填加的学生的成绩:\n");
scanf("%d %d %d",&p->data.stu_score.math,&p->data.stu_score.english,
&p->data.stu_score.c_language);
s=p->data.stu_score.c_language+p->data.stu_score.english+p->data.stu_score.math;
p->data.stu_score.ave=s/3.0;
//st=in_infor->next;
if(st==NULL)
{
printf("链表发生错误!\n");
return NULL;
}
else
{
/*in_infor->next=p;
p->next=st;
return in_infor;*/
while(st!=NULL)
{
if(st->data.stu_score.avedata.stu_score.ave)
break;
st=st->next;
}
q=in_infor;
while(q->next!=st)
q=q->next;
q->next=p;
p->next=st;
return in_infor;
}
}