双链表嵌套实现学生管理系统

#题目:链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。
场景:一个年级,相当链表A
该年级5个班,每个班5个人,相当于链表B1–B5
做一个学生成绩管理系统
学生成绩有语文 数学 英语
功能: 录入成绩 找最三科总分的最高分 最低分 算出平均分

首先这是一个双链表的题目(也就是两个结构体)首先我们要定义两个结构体,class和student

struct Class    //A
{
	struct student *top;
	struct Class *next;
};
struct student //B
{
	double yuwen;
	double shuxue;
	double yingyu;
	struct student *next;
};

首先我们要实现第一个功能(插入学生的信息)

struct student *BinitNode(int i)//使用头插法插入新的学生信息
{
	int j;
	struct student *B = NULL;
	struct student *New = NULL;
	for (j = 1; j <= 5; j++){
		New = (struct student *)malloc(sizeof(struct student));
		printf("请输入%d班的第%d个学生的语文成绩:", i, j);
		scanf("%lf", &(New->yuwen));
		if (New->yuwen < 0 || New->yuwen > 150)
		{
			printf("输入错误,请重新输入:");
			scanf("%lf", (&New->yuwen));
		}
		printf("请输入%d班的第%d个学生的数学成绩:", i, j);
		scanf("%lf", &(New->shuxue));
		if (New->shuxue < 0 || New->shuxue > 150)
		{
			printf("输入错误,请重新输入:");
			scanf("%lf", (&New->shuxue));
		}
		printf("请输入%d班的第%d个学生的英语成绩:", i, j);
		scanf("%lf", &(New->yingyu));
		if (New->yingyu < 0 || New->yingyu > 150)
		{
			printf("输入错误,请重新输入:");
			scanf("%lf", (&New->yingyu));
		}
		if (B == NULL){
			B = New;
		}
		else{
			New->next = B;
			B = New;
		}
	}
	return B;
}

void AinitNode()
{
	struct Class *New = NULL;
	int i;
	for (i = 1; i <= 5; i++){
		New = (struct Class *)malloc(sizeof(struct Class));
		New->top = BinitNode(i);
		if (A == NULL){
			A = New;
		}
		else{
			New->next = A;
			A = New;
		}
	}
}

最后输出

void printALL()
{
	double Mmax = A->top->shuxue;
	double Cmax = A->top->yuwen;
	double Emax = A->top->yingyu;

	double Mmin = A->top->shuxue;
	double Cmin = A->top->yuwen;
	double Emin = A->top->yingyu;

	double Msum = 0;
	double Csum = 0;
	double Esum = 0;

	double Mav = 0;
	double Cav = 0;
	double Eav = 0;
	double av = 0;
	while (A != NULL){
		while (A->top != NULL){
			if (A->top->next != NULL){
				if (Mmax < A->top->next->shuxue){
					Mmax = A->top->next->shuxue;
				}
				else{
					Mmin = A->top->next->shuxue;
				}
				if (Cmax < A->top->next->yuwen){
					Cmax = A->top->next->yuwen;
				}
				else{
					Cmin = A->top->next->yuwen;
				}
				if (Emax < A->top->next->yingyu){
					Emax = A->top->next->yingyu;
				}
				else{
					Emin = A->top->next->yingyu;
				}
			}
			Msum += A->top->shuxue;
			Csum += A->top->yuwen;
			Esum += A->top->yingyu;
			av++;
			A->top = A->top->next;
		}
		A = A->next;
	}
	Mav = Msum / av;
	Cav = Csum / av;
	Eav = Esum / av;
	printf("mathsMax = %.1lf,chineseMax = %.1lf,englishMax = %.1lf\n", Mmax, Cmax, Emax);
	printf("mathsMin = %.1lf,chineseMin = %.1lf,englishMin = %.1lf\n", Mmin, Cmin, Emin);
	printf("mathsAV = %.2lf,chineseAV = %.2lf,englishAV = %.2lf\n", Mav, Cav, Eav);
}
int main()
{
	AinitNode();
	printALL();
	return 0;
}
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值