链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。
链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。
链表都有一个头指针,一般以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(" ** 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;
}
以上就是C语言利用链表实现学生成绩管理系统的详细内容,更多关于C语言学生成绩管理系统的资料请关注编程网其它相关文章!