C语言版-学生信息管理系统(链表实现)

#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[]); //链表的创建 intStu_Entry(STU stu[]); //学生信息的录入 int Score_Entry(STU score[]); //学生成绩的录入 voidS_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]; //输入用户名 charkey[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:{ SCOREresult; 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=https://www.it610.com/article/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=https://www.it610.com/article/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; inext; } 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; } returnh; } 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.ave【C语言版-学生信息管理系统(链表实现)】data.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; } }```

    推荐阅读