问答题 1.  N名学生的成绩已在主函数中放入一个带有头结点的链表结构中,h指向链表的头结点。请编写函数fun(),其功能是:找出学生的最高分,并由函数值返回。
    注意:部分源程序如下。
    请勿改动main()函数和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
    试题程序:
    #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)
    //产生8个结点的链表,各分数存入链表中
    {
    q=(STREC*)malloc(sizeof(STREC));
    p->s=s[i];i++;p->next=q;
    p=q;
    }
    p->next=NULL;
    return h://返回链表的首地址
    }
    void outlist(STREC *h)
    {
    STREC *p;
    p=h;
    printf("head");
    do{
    printf("->%2.Of",p->s);
    p=p->next;
    }
    //输出各分数
    while(p->next!=NULL);
    printf("\n\n");
    }
    void main()
    {
    double s[N]={85, 100, 99, 85, 91, 72, 64, 87
    },max;
    STREC *h;
    h=creat(s);
    outlist(h);
    max=fun(h);
    printf("max=%6.1f\n",max);
    }
【正确答案】double fun(STREC*h)
   {
   double max=h->s;
   while(h!=NULL)/*通过循环找到最高分数*/
   { if(max<h->s)max=h->s;
   h=h->next;
   }
   return max;
   }
【答案解析】 本题考查的是结构体类型、指针型变量、链表和if语句等知识点。需要用for循环遍历链表中的每一个结点,用判断语句比较结点数据域的大小。可以通过while循环实现对最大成绩的查找,具体步骤为遍历链表遇到比max大的值(max<h->s),则赋值给max(max=h->s)。需要注意的是,h是指向结构体类型的指针变量,引用它指向的结构体的成员时,要用指向运算符“->”。