#include <stdio.h> #include <malloc.h> #include <string.h> typedef struct student /*每个学生节点的结构*/ { char sname[10]; /*学生姓名*/ int deg; /*分数*/ struct student * hnext; /*指向该班的下一个学生节点*/ } StudType; typedef struct classn /*每个班号节点的结构*/ { char cname[10]; /*班号*/ float avg; /*平均分*/ struct classn * vnext; /*指向下一个班号链表的头节点*/ StudType * hnext; /*指向该班的第1个学生节点*/ } ClassType; ClassType * Input() { ClassType * h, * p, * q; studType * s, * t; char cn[10],sn[10]; int n,i; h=(ClassType * )malloc(sizeof(ClassTypr)); /*创建班名链表的头节点*/ h->vnext=NULL;h->next=NULL; p=h; while(1) { printf("输入班号(以*结束):"); scanf("%s",cn); if (strcmp(cn," * ")==0) break; q=(ClassTypr * )malloc(sizeof(ClassType)); /*创建一个班号节点*/ strcpy(q->cname,cn); q->vnext=NULL;q->hnext=NULL; p->vnext=q;p=q; /*p始终指向班名链表的最后一个节点*/ i=1; while(1) { printf(" %s班学生%d姓名(以*结束):"cn,i); scanf("%s",sn); if (strcmp(sn," * ")==0) break; printf(" %s班学生%d分数:",cn,i++ ); scanf("%d",&n); s=(StudType * )malloc(sizeof(StudType)); /*创建一个学生节点*/ strcpy(s->sname,sn); s->deg=n; s->hnext=NULL; if (i==2) /*本班第1个学生*/ { q->hnext=s; t=s; /*t始终指向该班学生链表的最后一个节点*/ } else { t->hnext=s; t=s; } } } return h; } void Avg(ClassType * h) { ClassType * p=h->vnext; StudType * s; int num,sum; while (p!=NULL) { s=p->hnext; num=sum=0; while (s!=NULL) { num++: sum+=s->deg; s=s->hnext; /*水平方向查找下一个学生节点*/ } p->avg=1.0*sum/num; p=p->vnext /*垂直方向查找下一个班号节点*/ } } void DispList(ClassType * h) { ClassType * p=h->vnext; StudType * s; printf("执行结果:\n"); while (p!=NULL) { printf(" 班号:%s 平均分:%g\n",p->cname,p->avg); printf(" "); s=p->hnext: while (s!=NULL) { printf(" %s(%d) ",s->sname.s->deg); s=s->hnext; /*水平方向查找下一个学生节点*/ } p=p->vnext; /*垂直方向查找下一个班号节点*/ printf("\n")' } } void main() { ClassType * h; h=Input(); /*建立学生链表结构*/ Avg(h); /*求各班平均分*/ DispList(h); /*输出学生数据*/ }
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题