问答题 N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。 例如,若学生的成绩是:85,76,69,85,91,72,64,87,则平均分应当是:78.625。 注意:部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 #include #include #define N 8 struct 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(is=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.If",p->s);p=p-> next;} while(p!=0); printf("/n/n")/ } main () {double s[N] = {85,76,69,85,91, 72, 64,87 },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++) fscanf(in, "%lf,", &s[j]); h=creat(s); ave=fun(h); fprintf(out, "%6.31f/n", ave) ; } fclose(in); fclose(out); }
【正确答案】正确答案:STREC *p=h一>next; /* 由于头结点 中没有存放数据 */ double av=0.0; /*对计算成绩平均 值的变量进行初始化 */ int n=0; while(p!=NULL){ /*判断链表是否结束 */ av=av+p一>s; /* 对成绩进行累加 */ p=p一>next; /* 到下一个结点位置 */ n++; /* 人数加1 */ } av /=n; /* 计算成绩平均值 */ return av; /* 返回成绩平均值 */
【答案解析】解析:(1)首先定义存放平均值的变量,并对其初始化。 (2)在循环中,依次取链表中存放的成绩,并对其求和。 (3)最后计算平均值,并返回值。