问答题 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(i { 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[N]={85,76,69,85,91,72,64,87},ave; STREC *h; h=creat( s ); outlist(h); ave=fun( h ); printf("ave= %6.3f/n",ave); NONO(); }
【正确答案】#include #include double fun( STREC *h ) { 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 ; /* 返回成绩平均值 */ }
【答案解析】