P030 链表:找出学生的最高分 ★★

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

所属年份:2010年9月以前真考题目

N名学生的成绩已在主函数中放入一个带有头节点的链表结构中,h指向链表的头节点。请编写函数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  )
{
	double max = h->s;
	while (h)
	{
	    if (h->s > max)  max = h->s;
		h = h->next;	
	}

    return max;
}

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("->%2.0f",p->s);
        p=p->next;
    } while(p!=0);
    printf("\n\n");
}

int main()
{
    double  s[N]= {85,76,69,85,91,72,64,87}, max;
    STREC  *h;
    h=creat( s );
    outlist(h);
    max=fun( h );
    printf("max=%6.1f\n",max);
    return 0;
}

【考点分析】
本题考查:结构体类型;指针型变量;链表的相关知识。

【解题思路】
本题使用循环语句遍历链表中的每个结点,用判断语句比较结点数据的域大小。注意,h是一个指向结构体类型的指针变量,若要引用它所指向的结构体中的某一成员时,要用指向运算符”->”。

【参考答案】

double  fun( STREC *h  )
{
   double max=h->s;
   while (h!=NULL)         /*通过循环找到最高分数*/
   {
        if(h->s>max) max=h->s;
        h=h->next;
   }
  return max;
}

使用for循环,代码更加清晰

double fun( STREC *h)
{
    double max=0.0;
    STREC *p;
    for (p=h->next; p!=NULL; p=p->next) /* 从第2个数开始遍历 */
        if (p->s > max) max = p->s;
    return max;
}