问答题
若干名学生的成绩已在主函数中放入一个带头结点的链表结构中,h指向链表的头结点。请编写函数fun,其功能是:求出学生的平均分,并由函数值返回此平均成绩。例如,若学生的成绩是:85 76 69 85 91 72 64 87,则平均分应当是:78.625。注意:部分源程序在文件PROC1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include<stdio.h>#include<stdlib.h> #define N 8struct slist{double s;struct slist*next;}:typedef struct slist STREC;double fun(STREC*h){}STREC*creat(double*s){STREC*h,*P,*q;int i=0;h=P=(STREC*)malloc(sizeof(STREC));p一>s=0;while(i<N){q=(STREC*)malloc(sizeof(STREC));q一>s=s[i];i++;p一>next=q;p=q;P一>next=0:return h;}outlist(STREC*h){STREC*P;p=h一>next;printf(''head'');do{printf(''一>%4.1f'',p一>s);p=p一>next;}while(p!=0);printf(''\n\n'');}main(){double s E N]={92,83,72,81,90,85,75,65},ave;void NONO();STREC*h;h=creat(s);outlist(h);ave=fun(h);printf(''ave=%6.3f\n'',ave);NONO();}void NONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*in,*out;int i,j;double s [N],ave;STREC*h;in=fopen(''in.dat'',''r'');out=fopen(''out.dat'',''W'');for(i=0;i<10;i++){for(j=0;j<N;j++)fseanf(in,''%lf,'',&s[j]);h=creat(s);ave=fun(h);fprintf(out,''%6.3lf''.ave);}fclose(in);fclose(out);}
【正确答案】正确答案:double fun(STREC*h) { double ave=0.0; STREC*p=h一>next; while(p!=NULL)
{ave=ave+p一>s;p=p一>next;} return ave/N; }
【答案解析】解析:题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各节虐数据域中数值的和,再对和求平均分。遍历链表时应定义一个指向节点的指针p,因为“头节点”中没有数值,所以程序中让p直接指向“头节点”的下一个节点,使用语句STREC*p=h->next。