C语言基础-链表(三)基于链表的学生成绩管理系统

先讲一下要求

项目要求:使用链表实现一个学生成绩管理系统。

场景:一个年级,相当链表A,该年级5个班,每个班5个人,相当于链表B1-B5;链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5头结点

1、可输入学生的三门科目成绩(语文、数学、英语)。

2、打印出各个学生的成绩(按班级打印)。

3、打印出每个班最好的总成绩。

4、打印出每个班最差的总成绩。

5、打印出每个班的平均成绩。

觉得这个不好理解的同学,可以先看看这个简易版的简易版学生成绩系统C语言基础-结构体(一)综合:学生成绩管理系统( 姓名、成绩、最高分、最低分、平均分)(结构体、函数、指针)

需要封装的一些函数:

1、尾插法建立链表函数;

2、打印班级总分最高函数;

3、打印班级总分最低函数;

4、打印班级平均分函数;

5、主函数;

定义两个结构体:班级、学生

班级:

/*班级结构体*/	
typedef struct CLASS{
	int data;//班级号
	struct STUDENT *student_next;//班级内部指针
	struct CLASS *next;//下一个班级的指针
}CLASS;

学生:

/*学生结构体*/	
typedef struct STUDENT{
	int c_data;//学生语文成绩
	int m_data;//学生数学成绩
	int e_data;//学生英语成绩
	struct STUDENT *next;//下一个学生
}LNode,Linklist;

1、尾插法建立链表函数:

一、建立链表B,班级内部每个学生的成绩

/*尾插法创建班级内部学生成绩链表*/	
Linklist *linkinsert_Tail(Linklist* L,int student_num)
{
	LNode *s;
	int i=0;
	int c_score;//学生语文成绩
	int m_score;//学生数学成绩
	int e_score;//学生英语成绩
	L=(Linklist*)malloc(sizeof(LNode));
	LNode *p=L;
	printf("please input %d student	Chinese,Math,English score:\n",i+1);
	scanf("%d,%d,%d",&c_score,&m_score,&e_score);
	for(i=1;i<=student_num;i++){
		s=(LNode*)malloc(sizeof(LNode));
		s->c_data=c_score;
		s->m_data=m_score;
		s->e_data=e_score;
		p->next=s;
		p=s;
		if(i!=student_num){
			printf("please input %d student	Chinese,Math,English score:\n",i+1);
			scanf("%d,%d,%d",&c_score,&m_score,&e_score);	
		}
	}
	p->next=NULL;
	return L;
}

二、建立链表A,班级,用于存放班级号和每个班内部成绩链表B的头结点

/*尾插法创建班级链表*/	
CLASS* creatclass(CLASS* S,Linklist *L,int class_num)
{
	CLASS* c;
	int i=0;
	S=(CLASS*)malloc(sizeof(CLASS));
	CLASS *r=S;
	for(i=1;i<=class_num;i++){
		c=(CLASS*)malloc(sizeof(CLASS));	
		c->data = i;
		r->next=c;
		printf("%d class\n",c->data);
		L=linkinsert_Tail(L,studentnum);/*尾插法创建班级内部学生成绩链表*/
		r->student_next =L;//班级链表与班级内部链表相联,题目中A、B两个链表相联
		r=c;
	}
	r->next=NULL;
	return S;
}

进行了这两步的操作后,内存中生成了如下图的存储空间:

在这里插入图片描述

2、打印班级所有学生分数;

void printf_allclass(CLASS* S)
{
	int i=0;
        CLASS*h=S;
		LNode*c=h->student_next;
        while(h->next!=NULL){
		printf(" class %d \n",h->next->data);//打印是几班
		printf_allscore(c);//打印班级所有同学成绩
		printf_maxscore(c);//打印班级总分最高分成绩
		printf_minscore(c);//打印班级总分最低分成绩
		printf_averagescore(c);//打印班级总分平均分成绩
	    h=h->next;//下一个班级
		c=h->student_next;
        }
}

3、打印班级总分最高函数;

void printf_maxscore(Linklist* L)
{
	int i=0;
	int maxscore=0;
	int totalscore=0;
	LNode*p=L->next;
	while(p!=NULL){
		totalscore = p->c_data+p->m_data+p->e_data;
		if(maxscore<totalscore){
			maxscore=totalscore;
		}
		p=p->next;
		i++;
	}
	printf("student maxtotalscore:%d\n",maxscore);
}

4、打印班级总分最低函数;

void printf_minscore(Linklist* L)
{
	int i=0;
	int totalscore=0;
	LNode*p=L->next;
	int minscore=p->c_data+p->m_data+p->e_data;
	while(p!=NULL){
		totalscore = p->c_data+p->m_data+p->e_data;
		if(minscore>totalscore){
			minscore=totalscore;
		}
		p=p->next;
		i++;
	}
	printf("student maxtotalscore:%d\n",minscore);
}

5、打印班级平均分函数;

void printf_averagescore(Linklist* L)
{
	int i=0;
	int averagescore=0;
	int totalscore=0;
	int class_totalscore=0;
	LNode*p=L->next;
	while(p!=NULL){
		i++;
		totalscore = p->c_data+p->m_data+p->e_data;
		class_totalscore=class_totalscore+totalscore;
		p=p->next;
	}
	averagescore=class_totalscore/i;
	printf("student averagetotalscore:%d\n",averagescore);
}

6、主函数;

int main()
{
	Linklist* L;//学生
	CLASS* S;//班级
	S=creatclass(S,L,classnum);//创建链表
	printf_allclass(S);//输出所有班级成绩(包括班级最高分、最低分、平均分)
    system("pause");
	return 0;
}

实现截图

输入

在这里插入图片描述

在这里插入图片描述

输出

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值