首页 > 试题广场 >

有若干个班,每个班的学生人数不等,每个学生含姓名、分数数据。

[问答题]
有若干个班,每个班的学生人数不等,每个学生含姓名、分数数据。编写一个程序,输入各班学生姓名和分数后,统计各班平均分并输出各班学生分数及平均分。

推荐
由于班级个数与每班学生人数不定,为了节省内存,可以采用单链表存储数据,其结构如图所:
左边自上到下为一个班号链表,存放各班的班号、平均分以及相关指针域,为了方便起见,该链表有一个表头节点 *h;每条自左向右的链表存放一个班的学生数据。约定自左向右的指针为hnext(水平方向),自上向下的指针为vnext(垂直方向)。建立班号单链表和每个班的单链表均采用尾插法建表。
程序如下:
#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);        /*输出学生数据*/
}

发表于 2018-04-16 21:18:39 回复(0)