在主函数中已将N名学生的成绩放入一个带头结点的链表结构中,h指向链表的头结点。请编写函数fun,它的功能是:求出平均分,由函数值返回。
例如,若学生的成绩是:85,76,69,85,91,72,64,87,则平均分应当是:78.625。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
文件PROG1.C内容如下:
#include<stdio.h>
#include<stdlib.h>
#define N 8
struct slist
double s ;
struct stist * next;
;
typedef struct slist STREC;
double fun(STREC * h )
STREC * creat( double * s)
STREC * h, * p, * q;
int i=0;
h = p = (STREC * ) malloe (sizeof( STREC ));
p->s=0;
while(i<N)
q=(STREC * ) malloe ( sizeof( STREC ) ) ;
q->s=s[i] ;
i++;
p->next = q ;
p=q;
p->next = 0 ;
return h ;
void outlist (STREC * h)
STREC * p ;
p = h->next ;
prinff( " head" ) ;
do
prinff( " ->% 4.1f" , p->s) ;
p=p->next;
while(p! =0);
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 );
prinff("ave= %6.3f\n" ,ave) ;
参考答案:double fun(STREC *h){
double sum=0,aver;
int n=0;
STREC *p;
p=h->next;
while(p! =NULL){sum=sum+p->s;n++;p=p->next;}
aver=sum/n:
return aver:
}
解析: 程序由4个函数构成,其中creat函数的功能是创建链表,outlist函数的功能是输出链表结点数据域的值。main函数中,首先调用creat函数,将s数组中8个元素的值依次放入链表的8个结点中,并调用outlist函数输出该链表;然后调用fun函数求出这8个数据的平均值并输出最后的结果。
要求平均分,必须对链表从头到尾进行遍历,求出所有结点的和以及结点的个数。参考答案:中,函数fun的功能是:由于链表是带头结点的链表,所以第一个结点没有数据域,因此将h->next赋值给指针p。while循环中,当p不为空,则进入循环体,首先将p->s累加到变量sum中,变量n统计结点的个数,当p指向结点的数据域进行累加后,通过“p=p->next;”语句使指针p指向下一个结点。所有结点处理完毕后跳出循环,利用sum/n求出平均值并返回。
[归纳总结] 本套试题的程序填空和程序设计题考查的是链表的处理。链表处理的程序中通常已经编写好了以下几个函数:
(1)creatlist函数,该函数的功能是创建链表。
(2)outlist函数,该函数的功能是输出链表结点数据域的值。在程序填空题或程序设计题中,这两个函数已经给出,我们只需要了解它的功能即可。需要仔细阅读的是main函数中对函数fun的调用语句,掌握实参和形参的意义,并从题目叙述中了解函数fun要实现什么功能,从而进行程序设计。