C语言利用链表实现学生成绩管理系统
Dong__ZW 人气:2链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。
链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。
链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。
说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。
本文就将利用C语言中的链表实现一个简单的学生成绩管理系统
示例代码
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> int choice = 0; int mima=123456; int zhanghao=123456; int summ=0;//学生总数 int i=0,j=0,k=0;//数学英语树脂不及格的人数 using namespace std; typedef struct STUDENT { int num; //学号 char name[15]; //姓名 char major[15]; //专业 double math; //数学成绩 double english; //英语成绩 double shuzhi; //IKUN树脂分 double average; //平均分 double sum; //总分 }student; typedef struct Node { student data; struct Node *next; }Node,*LinkList; void CreateList(LinkList &l); //创建链表 void ZenjaiNode(LinkList &l, student e); //增加节点 int ShanchuNode(LinkList &l, int num); //删除节点 int XuigaiNode(LinkList &l, int num, student e); //修改节点 int Chazhao(LinkList l, int num, student &e); //查找节点 void ZenjiaStudent(LinkList &l); //增加学生 void ShanchuStudent(LinkList &l); //删除学生 void XuigaiStudent(LinkList &l); //修改学生 void ChazhaoStudent(LinkList l); //查找学生 void XianshiStudent(LinkList l); //显示学生 void menu(); //主菜单 void math(); void english(); void shuzhi(); void mathmax(); void englishmax(); void shuzhimax(); void CreateList(LinkList &l)//创建链表,头节点 { l=(LinkList)malloc(sizeof(Node)); l->next=NULL; } void ZenjiaNode(LinkList &l, student e)//尾插节点 { Node*q=(LinkList)malloc(sizeof(Node)); q->data=e; q->next=NULL; Node*p=l; while(p->next) p=p->next; p->next=q; } int ShanchuNode(LinkList &l, int num)//删除节点 { Node *p,*q; p=l; while(p->next) { q=p->next; if(num==(q->data).num) { if((q->data).math<60) i--; if((q->data).english<60) j--; if((q->data).shuzhi<60) k--; p->next=q->next; free(q); return 0;//删除完成 } p=p->next; } return 1;//未找到 } int XuigaiNode(LinkList &l, int num, student e)//修改节点 { Node *p,*q; p=l; while(p->next) { q=p->next; if(num==(q->data).num) { q->data=e; return 0;//修改完成 } p=p->next; } return 1;//修改失败 } int ChazhaoNode(LinkList l, int num,student &e)//查找节点 { Node *p,*q; p=l; while(p->next) { q=p->next; if(num==(q->data).num) { e=q->data; return 0;//查找完成 } p=p->next; } return 1;//查找失败 } void ZenjiaStudent(LinkList &l) //增加学生 { summ++; student e; printf("小黑子请输入你想录入IKUN的成绩吧!\n") ; printf("学号\n"); scanf("%d",&e.num); //getchar(); printf("姓名\n"); scanf("%s",e.name); //getchar(); printf("专业\n"); scanf("%s",e.major); //getchar(); printf("数学成绩\n"); scanf("%lf",&e.math); printf("英语成绩\n"); scanf("%lf",&e.english); printf("IKUN树脂分\n"); scanf("%lf",&e.shuzhi); e.average=(e.math+e.english+e.shuzhi)/3; e.sum=e.math+e.english+e.shuzhi; ZenjiaNode(l, e); system("pause"); } void ShanchuStudent(LinkList &l) //删除学生 { summ--; int num; printf("请输入要删除的IKUN的学号\n"); scanf("%d",&num); if(ShanchuNode( l, num)==1) printf("查找失败哎呦,你个黑子冒充IKUN,香翅捞饭食不食\n"); else { printf("删除成功了,奖励一个蛋\n"); } system("pause"); } void XuigaiStudent(LinkList &l) //修改学生信息 { student e; int num; char x; printf("请输入要修改IKUN的学号\n"); scanf("%d",&num); printf("请重新输入信息吧\n"); printf("请输入学号\n"); scanf("%d",&e.num); printf("请输入姓名\n"); scanf("%s",e.name); printf("请输入专业\n"); scanf("%s",e.major); printf("请输入数学成绩\n"); scanf("%lf",&e.math); printf("请输入英语成绩\n"); scanf("%lf",&e.english); printf("请输入树脂分\n"); scanf("%lf",&e.shuzhi); e.average=(e.math+e.english+e.shuzhi)/3; e.sum=e.math+e.english+e.shuzhi; if( XuigaiNode(l,num,e)==1) printf("未找到该IKUN\n"); else printf("修改完成\n"); system("pause"); } void ChazhaoStudent(LinkList l) //查找学生 { student e; int num; printf("请输入要查找的IKUN学号\n"); scanf("%d",&num); if(ChazhaoNode( l, num,e)==1) printf("没有找到哦\n"); else { printf("学号 姓名 专业 数学成绩 英语成绩 树脂分 平均分 总分\n"); printf("%-8d%-8s%-8s%-11.2f%-11.2f%-10.2f%-10.2f%-10.2f\n",e.num,e.name,e.major,e.math,e.english,e.shuzhi,e.average,e.sum); system("pause"); } } void XianshiStudent(LinkList l) //显示学生 { printf("学号 姓名 专业 数学成绩 英语成绩 树脂分 平均分 总分\n"); Node *p=l; student e; while(p->next) { e=(p->next)->data; printf("%-8d%-8s%-8s%-11.2f%-11.2f%-10.2f%-10.2f%-10.2f\n",e.num,e.name,e.major,e.math,e.english,e.shuzhi,e.average,e.sum); p=p->next; }system("pause"); } void paixu(LinkList l)//总分排序 { student e; Node *p,*q; p=l->next; if(p->next==NULL) printf("请输入IKUN之后再来吧\n"); else { while(p->next!=NULL) { q=p->next; while(q!=NULL) { if(p->data.average<q->data.average) { e=p->data; p->data=q->data; q->data=e; } q=q->next; } p=p->next; } printf("排序成功\n"); } system("pause"); } void math(LinkList l)//数学不及格 { Node *p; student e; p=l; while(p->next!=NULL) { e=(p->next)->data; if(e.math<60) { printf("数学不及格学员如下:\n"); printf("姓名:%s 成绩:%.2f\n",e.name,e.math); } p=p->next; i++; } if(i==0&&summ!=0) { printf("所有人都及格了呢\n"); } else if(summ==0) printf("系统人数为0,请添加信息后再试\n"); system("pause"); } void english(LinkList l)//英语不及格 { Node *p; student e; p=l; while(p->next!=NULL) { e=(p->next)->data; if(e.english<60) { printf("英语不及格学员如下:\n"); printf("姓名:%s 成绩:%.2f\n",e.name,e.english); j++; } p=p->next; } if(j==0&&summ!=0) { printf("所有人都及格了呢\n"); } else if(summ==0) printf("系统人数为0,请添加信息后再试\n"); system("pause"); } void shuzhi(LinkList l)//树脂不及格 { Node *p; student e; p=l; while(p->next!=NULL) { e=(p->next)->data; if(e.shuzhi<60) { printf("树脂不及格学员如下:\n"); printf("姓名:%s 成绩:%.2f\n",e.name,e.shuzhi); k++; } p=p->next; } if(k==0&&summ!=0) { printf("所有人都及格了呢\n"); } else if(summ==0) printf("系统人数为0,请添加信息后再试\n"); system("pause"); } void mathmax(LinkList l) { Node *p,*q; double max; student e,f; p=l; q=p->next; e=(p->next)->data; max=e.math; while(q->next!=NULL) { f=(q->next)->data; if(f.math>max) max=f.math; q=q->next; } p=l; q=l->next; printf("数学最高分为:\n"); while(p->next!=NULL) { f=(p->next)->data; if(f.math==max) printf("学生:%s 成绩:%lf\n",f.name,f.math); p=p->next; } if(summ==0) printf("系统人数为0,请添加信息后再试\n"); system("pause"); } void englishmax(LinkList l) { Node *p,*q; double max; student e,f; p=l; q=p->next; e=(p->next)->data; max=e.english; while(q->next!=NULL) { f=(q->next)->data; if(f.english>max) max=f.english; q=q->next; } p=l; q=l->next; printf("英语最高分为:\n"); while(p->next!=NULL) { f=(p->next)->data; if(f.english==max) printf("学生:%s 成绩:%lf\n",f.name,f.english); p=p->next; } if(summ==0) printf("系统人数为0,请添加信息后再试\n"); system("pause"); } void shuzhimax(LinkList l) { Node *p,*q; double max; student e,f; p=l; q=p->next; e=(p->next)->data; max=e.shuzhi; while(q->next!=NULL) { f=(q->next)->data; if(f.shuzhi>max) max=f.shuzhi; q=q->next; } p=l; q=l->next; printf("树脂最高分为:\n"); while(p->next!=NULL) { f=(p->next)->data; if(f.shuzhi==max) printf("学生:%s 成绩:%lf\n",f.name,f.shuzhi); p=p->next; } if(summ==0) printf("系统人数为0,请添加信息后再试\n"); system("pause"); } void menu() { system("cls"); printf(" ***************IKUN成绩管理系统***************\n"); printf(" \t** **\n"); printf(" \t** author:南工第一IKUN **\n"); printf(" \t** **\n"); printf(" ** 1.录入新的IKUN的成绩 **\n"); printf(" ** 2.按学号删除IKUN的成绩 **\n"); printf(" ** 3.按学号修改IKUN的成绩 **\n"); printf(" ** 4.查找IKUN的成绩 **\n"); printf(" ** 5.显示IKUN们的成绩 **\n"); printf(" \t** 6.根据总分排序 **\n"); printf(" \t** 7.显示数学不及格的IKUN **\n"); printf(" \t** 8.显示英语不及格的IKUN **\n"); printf(" \t** 9.显示树脂不及格的小黑子 **\n"); printf(" \t** 10.查看数学最高分 **\n"); printf(" \t** 11.查看英语最高分 **\n"); printf(" \t** 12.查看树脂最高分 **\n"); //printf(" ** 13.退出登录 **\n"); printf(" \t** 13.保存数据到文件 **\n"); printf(" \t** 14.从文件中读取数据 **\n"); printf(" \t** 15.插入一个新学生 **\n"); printf(" ** 16.退出登录 **\n"); printf(" ** 0.退出成绩管理系统 **\n"); printf(" **********************************************\n"); printf(" 请输入你想进行的操作:0-13 \n"); } void xuigai2()//找回密码之后登录 { int mi=0; int caozuo=0; int zhang=0; int anns=0; while(1) { printf("请输入你的账号\n"); scanf("%d",&zhang); printf("请输入你的密码\n"); scanf("%d",&mi); if(mi==mima&&zhang==zhanghao) { choice = 1; printf("登录成功!\n"); system("pause"); system("cls"); break; } else { system("cls"); anns++; if(anns<5) printf("账号或密码有误,请重新输入\n"); if(anns==5) printf("你干嘛哎呦,都错五次了,好好想想再来吧!\n"); } if(anns==5)break; } } void zhaohui()//找回密码 { int guodu; int guodu2; int zhang;//输入要找回密码的账号 while(1) { printf("请输入要找回密码的账号\n"); scanf("%d",&zhang); if(zhang==123456) { printf("请输入更改后的密码:"); scanf("%d",&guodu); printf("请再次输入更改后的密码:"); scanf("%d",&guodu2); if(guodu==guodu2) { mima=guodu2; printf("修改成功,请登陆吧\n"); system("pause"); xuigai2(); break; } else { system("cls"); printf("两次输入不同,修改失败,请重新输入账号\n"); } } else { system("cls"); printf("该账号不存在,请重新输入账号\n"); } } } void charu(LinkList l) { Node *p,*y; int num2; printf("请输入要插入的位置(谁之后)\n"); scanf("%d",&num2); p=l->next; while(p!=NULL) { if(num2==p->data.num) { y=p->next; summ++; student e; printf("小黑子请输入你想录入IKUN的成绩吧!\n") ; printf("学号\n"); scanf("%d",&e.num); printf("姓名\n"); scanf("%s",e.name); printf("专业\n"); scanf("%s",e.major); printf("数学成绩\n"); scanf("%lf",&e.math); printf("英语成绩\n"); scanf("%lf",&e.english); printf("IKUN树脂分\n"); scanf("%lf",&e.shuzhi); e.average=(e.math+e.english+e.shuzhi)/3; e.sum=e.math+e.english+e.shuzhi; Node*q=(LinkList)malloc(sizeof(Node)); q->data=e; q->next=y; p->next=q; printf("插入成功\n"); break; } else p=p->next; } if(p==NULL) printf("插入失败\n"); system("pause"); } void guanli()//登录界面 { int mi=0; int caozuo=0; int zhang=0; int anns=0; /*printf(" **********登录界面**********\n"); printf(" ** 账号: **\n"); printf(" ** 密码: **\n"); printf(" ** 输入0找回密码 **\n"); printf(" ****************************\n");*/ printf(" **********登录界面**********\n"); printf(" ** 1管理员登录1 **\n"); printf(" ** ovo **\n"); printf(" ** 0找回密码0 **\n"); printf(" ****************************\n"); printf("请输入想进行的操作:0-1\n"); scanf("%d",&caozuo); if(caozuo==1) { while(1) { printf("请输入你的账号\n"); scanf("%d",&zhang); printf("请输入你的密码\n"); scanf("%d",&mi); if(mi==mima&&zhang==zhanghao) { choice = 1; printf("登录成功!\n"); system("pause"); system("cls"); break; } else { system("cls"); anns++; if(anns<5) printf("账号或密码有误,请重新输入\n"); if(anns==5) printf("你干嘛哎呦,都错五次了,好好想想再来吧!\n"); } if(anns==5)break; } } else if(caozuo==0) { zhaohui(); } } void ReadFile(LinkList &l)//从文件中读取数据 { FILE *fp; fp=fopen("D:/b.txt","r"); if(fp==NULL) { printf("Can not open the file\n"); exit(1); } else { CreateList(l); student e; while(fscanf(fp,"%d %s %s %lf %lf %lf %lf %lf\n",&e.num,e.name,e.major,&e.math,&e.english,&e.shuzhi,&e.average,&e.sum)!=EOF) { ZenjiaNode(l,e); } printf("已成功读取数据\n"); } system("pause"); fclose(fp); } void WriteFile(LinkList &l)//保存数据到文件 { FILE *fp ; fp = fopen("D:/b.txt", "w"); if(fp == NULL) { printf("Can not open the file\n"); exit(1); } Node *p = l->next; student e; while(p!=NULL ) { fprintf(fp,"%-8d ",p->data.num); fprintf(fp,"%-8s ",p->data.name); fprintf(fp,"%-8s ",p->data.major); fprintf(fp,"%-16lf ",p->data.math); fprintf(fp,"%-16lf ",p->data.english); fprintf(fp,"%-16lf ",p->data.shuzhi); fprintf(fp,"%-16lf ",p->data.average); fprintf(fp,"%-16lf ",p->data.sum); fprintf(fp,"\n"); p = p -> next; } printf("保存成功\n"); fclose(fp); system("pause"); } int main() { int x; LinkList l; CreateList(l); guanli(); while(choice) { menu(); scanf("%d", &choice); switch(choice) { case 1: ZenjiaStudent(l);//增加学生 break; case 2: ShanchuStudent(l); //删除学生 break; case 3: XuigaiStudent(l);//修改学生 break; case 4: ChazhaoStudent(l);//查找学生 break; case 5: XianshiStudent(l); //显示所有学生 break; case 6: paixu(l);//排序 break; case 7:math(l);//数学不及格 break; case 8:english(l);//英语不及格 break; case 9:shuzhi(l);//树脂不及格 break; case 10:mathmax(l); break; case 11:englishmax(l); break; case 12:shuzhimax(l); break; case 13:WriteFile(l); break; case 14:ReadFile(l); break; case 15:charu(l); break; case 16:system("cls"); guanli(); break; default:printf("谢谢您的使用\n"); break; } } return 0; }
加载全部内容