N名学生的成绩已在主函数中放人一个带头结点的链表结构中,h指向链表的头结点。请编写函数fun,其功能是:求出平均分,并由函数值返回。
例如,若学生的成绩是:85,76,69,85,9l,72,64,87,则平均分应当是:78625。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若千语句。
试题程序:
#include<stdlib.h>
#include<stdio.h>
#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*)mallocsizeof(STREC));
P->s=0;
whilel(i<N)
q=(STREC*)mallodsizeof(STREC));
q->s=s[i];i++lp->next=q;P=q;
p->next=0;
return h;
ouclist(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.3f\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对链表进行遍历,头结点中没有数值,从其下一结点开始遍历,求出学生的成绩总和,并返回平均值。