问答题 N名学生的成绩已在主函数中放入一个带头结点的链表结构中,h指向链表的头结点。请编写函数fun,其功能是:求出平均分,并由函数值返回。 例如,若学生的成绩是:85,76,69,85,91,72,64,87,则平均分应当是:78.625。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 试题程序:#include < stdlib.h >#include < stdio.h >#define N 8stELI* s1ist{ double s; Struct s1ist * next;};typeclef struct s1ist 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.1 f",p一 >s); p=p一 >next;/*输出各成绩*/ }while(p!=NULL); printf("/n/n");}void main(){ double s[N]={8 5,7 6,6 9,85,91,72,64,87},ave; STREC* h; h=creat(s);outlist(h); ave=fun(h); printf("ave=%6.3 f/n",ave);}
【正确答案】正确答案:double fun(STREC *h) { double av =0.0; STREC *p =h 一 >next; /* p直接指向“头结点”的下一个结点,即第一个成绩*/ while (p!=NULL) {av=av +p一 >s; /*求总分数*/ p =p 一 >next; } return av/N;/*返回平均值*/ }
【答案解析】解析:本题考查:链表的操作,对链表的主要操作包括:建立链表、结构的查找与输出、插入一个结点、删除一个结点。 题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各结点数据域中数值的和,再求平均数。遍历链表时应定义一个指向结点的指针p,因为“头结点”中没有数值,所以程序中让p直接指向“头结点”的下一个结点,使用语句STREC*p =h一 >next;。