P007 链表:求平均分 ★★

03-程序设计题 软件121, 唐鼎威 739浏览

所属年份:2011.9
N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,其功能是:求出平均分,并由函数值返回。

例如,若学生的成绩是:85 76 69 85 91 72 64 87,则平均分应当是:78.625。

#include <stdio.h>
#include <stdlib.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*)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;
}

void 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");
}

int 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);
}

【考点分析】
本题考查:链表的操作,对链表的主要操作有以下几种:建立链表、结构的查找与输出、插入一个结点、删除一个结点。

【解题思路】

题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,求各结点数据域中数值的和,再对和求平均分。遍历链表时应定义一个指向结点的指针p,因为”头结点”中没有数值,所以程序中让p直接指向”头结点”的下一个结点,使用语句STREC *p=h->next。

【参考答案】

double  fun( STREC *h  )
{
    double ave=0.0;
    STREC *p=h->next;
    while(p!=NULL) {
        ave=ave+p->s;
        p=p->next;
    }
    return ave/N;
}