先讲一下要求
项目要求:使用链表实现一个学生成绩管理系统。
场景:一个年级,相当链表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;
}