问答题
N名学生的成绩已在主函数中放入一个带头结点的链表结构中,h指向链表的头结点。请编写函数fun,其功能是:求出平均分,并由函数值返回。例如,若学生的成绩是:85,76,69,85,9l,72,64,87,则平均分应当是:78.625。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdlib.h>#include<stdio.h>#define N 8struct slist{ double s; struct slist *next;};typedef struct slist STREC;double fun(STREC木h){}STREC*treat(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!=NULL); printf("\n\n");}void 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.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;。