问答题
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是指向结构体类型的指针变量,引用它指向的结构体的成员时,要用指向运算符“->”。