链表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;
}
二刷课程 ,觉得又学到了好多以前不解的地方,交作业了。。。。。。。。。。。