问答题 N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。 例如,若学生的成绩是:85,76,69,85,91,72,64,87,则平均分应当是:78.625。 注意:部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。1 #include<stdio.h>2 #include<stdlib.h>3 #define N 84 struct slist5 {double s;6 struct slist *next;7 };8 typedef struer slist STREC;9 double fun(STREC *h)10 {1112 }13 STREC * creat(double * s)14 {STREC *h,*p,*q;int i=0;15 h=p=(STREC *)malloc(sizeof(STREC));p->s=0;16 while(i<N)17 {q=(STREC *) malloc(sizeof(STREC));18 q->s=s[i];i++;p->next=q;p=q;19 }20 p->next=0;21 return h;22 }23 outlist(STREC *h)24 { STREC *p;25 p=h->next;printf(''head'');26 do27 { printf(''->%4.1f'',p->s);p=p-> next;)28 while(p!=0);29 printf(''\n\n'');30 }31 main()32 { double s[N]={85,76,69,85,91,72,64,87},ave;33 void NONO();34 STREC *h;35 h=creat(s);outlist(h);36 ave=fun(h);37 printf(''ave=%6.3f\n'',ave);38 NONO();39 }40 void NONO()41 {/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */42 FTLE *in,*out;43 int i,j;double s[N],ave;44 STREC *h;45 in=fopen(''in.dat'',''r'');46 out=fopen(''out.dat'',''w'');47 for(i=0;i<10;i++) {48 for(j=0 ; j<N;j++)fscanf(in,''%1f,'',&s[j]);49 h=creat(s);50 ave=fun(h);51 fprintf(out,''%6.31f\n'',ave);52 }53 fclose(in);54 fclose(out);}
【正确答案】正确答案:1 STREC *p=h->next; /*由于头结点中没有存放数据*/ 2 double av=0.0; /*对计算成绩平均值的变量进行初始化*/ 3 int n=0; 4 while(p!=NULL) {/*判断链表是否结束*/ 5 av=av+p->s; /*对成绩进行累加*/ 6 p=p->next; /*到下一个结点位置*/ 7 n++; /*人数加1 */ 8 } 9 av/=n; /*计算成绩平均值*/ 10 return av; /*返回成绩平均值*/
【答案解析】解析:(1)首先定义存放平均值的变量,并对其初始化。(2)在循环中,依次取链表中存放的成绩,并对其求和。(3)最后计算平均值,并返回值。