亲宝软件园·资讯

展开

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;
 	
}

加载全部内容

相关教程
猜你喜欢
用户评论