第一阶段C 测试题 -- 链表 -- 学生成绩管理系统

链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。

场景:一个年级,相当链表A
该年级5个班,每个班5个人,相当于链表B1–B5
做一个学生成绩管理系统
学生成绩有语文 数学 英语
功能: 录入成绩 找最三科总分的最高分 最低分 算出平均分

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

struct A{

	struct B *head;
	char *class;
	struct A *next;

};


struct B{

	char *name;
	float  Chinese;
	float  Math;
	float  English;
	float  Total;
	struct B *next;

};

struct A *CreatelinkA(struct A *headA,int m){

	int i;
	struct A *new;
	struct A *p = headA;

	for(i = 0;i<m;i++){
	
			new = (struct A *)malloc(sizeof(struct A));	//头插法创建链表
			
			new->head = (struct B *)malloc(sizeof(struct B)); //给新节点开辟空间
			new->class = (char *)malloc(16);
			memset(new->class,'\0',16);
			new->next = p;

			p = new;					//p重新指向头节点
			
			
	}

	headA = p;	//把headA 指向 p指向的空间,即链表A的头节点

	return headA;   
}


struct A *CreatelinkB(struct A *headA,int n){

	int k = 0;
	int i;
	struct A *p = headA;
	struct B *q ;
	struct B *new;

	while(p != NULL){
		
		q = p->head;
		q->name = (char *)malloc(16);
		q->next = NULL;

		for(i = 0;i<(n-1);i++){					//尾插法创建链表B

                        new = (struct B *)malloc(sizeof(struct B));
                        
                        new->name = (char *)malloc(16);

						new->next = NULL;

                        q->next = new;			//q重新指向尾节点
						q = new;
		
		}

		p = p->next;

	
	}


	return headA;

}


struct A *data_input(struct A *headA){

	struct A *p = headA;

	struct B *q = p->head;

	int k = 0;

	int t = 0;

	while(p != NULL){

		k++;
	
		printf("请输入第%d个班级的名字:",k);

		scanf("%s",p->class);

		getchar();

		while(q != NULL){

			t++;
			
			printf("请输入%s班第%d个学生的名字:",p->class,t);
			gets(q->name);

			printf("请输入%s的语文成绩:",q->name);
			scanf("%f",&(q->Chinese));
			getchar();

			printf("请输入%s的数学成绩:",q->name);
		    scanf("%f",&(q->Math));
            getchar();
	
			printf("请输入%s的英语成绩:",q->name);
            scanf("%f",&(q->English));
            getchar();

			q->Total = q->Chinese + q->Math + q->English;			

			
			q = q->next;
		
		}
	
		
		t = 0;
		p = p->next;

		if(p != NULL){

			q = p->head;
		
		}
	
	}



	return headA;
}


void data_operation(float *MaxTotal,float *MinTotal,float *Average,struct A *headA,int m,int n){

	struct A *p = headA;
	struct B *q = p->head;

	*MaxTotal = 0;
	*MinTotal = 9999;
	float sum = 0;
	int  a = m*n;

	while(p != NULL ){
	
		while(q != NULL){
		
			if(q->Total > *MaxTotal){
			
				*MaxTotal = q->Total;

			}


			if(q->Total < *MinTotal ){
			
				*MinTotal = q->Total;

			}


			sum = sum +q->Total;
		
			q = q->next;
		
		}
	
		p = p->next;

		if(p != NULL){

			q = p->head;

		}
	}

	*Average = sum/a;
	
}


void result(float *MaxTotal,float *MinTotal,float *Average){

	printf("MaxTotal = %0.2f\n",*MaxTotal);

	printf("MinTotal = %0.2f\n",*MinTotal);

	printf("Average = %0.2f\n",*Average);

}

int main(){

	struct A *headA = NULL;	//定义链表A的头节点
	int m =  5;	//链表A的节点个数		
	int n =  5;	//链表B的节点个数		

	float MaxTotal = 0;//最高分
	float MinTotal = 0;//最低分	
	float Average  = 0;//平均分	 

	headA = CreatelinkA(headA,m);	//创建链表A

	headA = CreatelinkB(headA,n);	//创建链表B

	headA = data_input(headA);	//输入学生信息

	data_operation(&MaxTotal,&MinTotal,&Average,headA,m,n);	//数据分析处理

 	result(&MaxTotal,&MinTotal,&Average);	//结果打印输出						

	return 0;

}

二刷课程 ,觉得又学到了好多以前不解的地方,交作业了。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

elaot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值