|

楼主 |
发表于 2013-7-4 12:55:45
|
显示全部楼层
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct Grade //定义用于储存成绩的动态表及其别名
- {
- float grade;
- struct Grade *next;
- }Grade;
- typedef struct Grade *GradeList; //定义指向成绩节点指针的别名
- typedef struct Student //定义用于储存学生信息的动态表及其别名
- {
- char name[20];
- GradeList G;
- float average;
- struct Student *next;
- }Student;
- typedef struct Student *StudentList; //定义指向学生信息指针的别名
- void setup(StudentList *L,int n,int m) //用于创建整张表的函数
- {
- StudentList p1,r1;
- GradeList p2,r2;
- int i,j;
- *L = (StudentList)malloc(sizeof(Student));//指向整个学生信息链表
- r1 = *L;//r1指向学生信息链表的尾部
- /***********头结点作为每科平均分的存放位置*/
- r2=r1->G=(Grade *)malloc(sizeof(Grade));
- for(j=0;j<m;j++)
- {
- p2 = (Grade *)malloc(sizeof(Grade));
- r2->next=p2;
- r2=p2;
- }
- r2->next=NULL;
- /*******************************************/
- for(i=0;i<n;i++)
- {
- p1 = (Student *)malloc(sizeof(Student));//生成新的学生信息节点
- printf("\nPlease enter the name of student %d:",i+1);//输入第i个学生的姓名
- scanf("%s",p1->name);
- p1->G=(GradeList)malloc(sizeof(Grade));//指向整个学生成绩链表
- r2=p1->G;//r2指向学生成绩链表的尾部
- for(j=0;j<m;j++)
- {
- p2 = (Grade *)malloc(sizeof(Grade));//生成一个新的学生成绩节点
- printf(" Please enter the grade of subject %d:",j+1);
- scanf("%f",&(p2->grade));//输入第J科成绩
- r2->next=p2;//将学生成绩终结点的指针指向新结点
- r2=p2;//将当前的新节点定义为学生成绩链表的表位终端结点
- }
- r2->next=NULL;//结束学生成绩链表
- r1->next=p1;//将学生信息链表表尾终端结点的指针指向新节点
- r1=p1;//将当前的新节点定义为学生信息链表的表尾终端结点
- }
- r1->next=NULL;//结束学生信息链表
- }
- void saverage(StudentList L,int n,int m)//计算每位学生的平均分
- {
- int i,j;
- StudentList r1;//定义指向学生信息链表尾结点的指针
- GradeList r2;//定义指向学生成绩链表尾结点的指针
- r1=L->next;//将指针指向学生信息链表首节点
- for(i=0;i<n;i++)
- {
- r2=r1->G->next;//将指针指向学生成绩链表首届点
- for(j=0;j<m;j++)
- {
- r1->average+=r2->grade/m;//计算平均成绩
- r2=r2->next;//指针向后移动一个节点
- }
- printf("\nThe average grade of sutdent %d is %.2f",i+1,r1->average);
- r1=r1->next;//向后移动一个节点
- }
- }
- float esgrade(StudentList L,int n,int m)//读取第N个学生的第M科的成绩
- {
- int i,j;//定义计数变量
- StudentList p1;
- GradeList p2;
- p1=L->next;
- i=1;
- while(p1&&i<n)//等待学生信息指针传递
- {
- p1=p1->next;
- i++;
- }
- p2=p1->G->next;
- j=1;
- while(p2&&j<m)//等待学生成绩指针传递
- {
- p2=p2->next;
- j++;
- }
- return p2->grade;//返回所需学生的成绩
- }
- void gaverage(StudentList L,int n,int m)//计算每科的平均分
- {
- GradeList p;
- int i,j;
- p=L->G->next;
- for(j=1;j<=m;j++)
- {
- for(i=1;i<=n;i++)
- {
- p->grade+=esgrade(L,i,j)/n;
- }
- printf("\nThe average grade of subject %d is %.2f",j,p->grade);
- p=p->next;
- }
- }
- void gmax(StudentList L,int n,int m)//
- {
- float max;
- int i,j,num;
- for(j=1;j<=m;j++)
- {
- max=esgrade(L,1,j);
- num=1;
- for(i=1;i<=n;i++)
- {
- if (esgrade(L,i,j)>max)
- {
- max=esgrade(L,i,j);
- num=i;
- }
- }
- printf("\nThe highest grade of subject %d is %.2f and it's the grade of student %d",j,max,num);
- }
- }
- void main(void)
- {
- int n=2,m=2;
- printf("\nIn this progrom after enter a data,please press the enter bottom to end.\n");
- StudentList L;
- setup(&L,n,m);
- printf("\n");
- saverage(L,n,m);
- printf("\n");
- gaverage(L,n,m);
- printf("\n");
- gmax(L,n,m);
- }
复制代码
|
|