一道C语言数据结构题,程序已给好,看不懂意思,求给分析。。注释。。重赏。。。!

N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:找出学生的最高分,由函数值返回。程序如下:#include<st... 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;
STREC *q=h;
max=h->s;
do
{
if(q->s>max)

max=q->s;

q=q->next;
}
while(q!=0);
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");
}

void 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);
}
展开
 我来答
yangzh_851
2011-02-24 · TA获得超过892个赞
知道小有建树答主
回答量:120
采纳率:66%
帮助的人:68.2万
展开全部
你这个分不太好赚哦...真不好琢磨你哪里不懂,这就关系到注释到哪种程度.能帮你理解多少算多少吧.
为了让你方便看,我们从节点定义和主函数开始.
------------------------------------------------
struct slist
{
double s; //用于存储分数的变量
struct slist *next; //指向下一个节点的指针
};

typedef struct slist STREC //申明节点结构类型
void main()
{
double s[N]={85,76,69,85,91,72,64,87}, max; //这是程序样本,即所谓N个学生的成绩.但这个N是有限的,静态的,编译的时候,#define N 8,最多就是8个.这显然只是用于测试后面处理用的样本.
STREC *h; //申明了一个节点指针。
此处需要说明一下的是,从这个代码的操作来看,这个链表是先进先出的队列操作模式,可以通俗的说h是这个队列的头。但此处代码,多用内存存储了一个0,从某种意义上说,这是不必要的;
h=creat(s);
//建立队列,将数组中的分数样本存储到队列。参数为数组首地址。
outlist(h);
//展示队列数据。
max=fun(h);
//调用fun,返回最大的分数值。
printf("max=%6.1f\n",max);
//按照指定宽度打印浮点数格式的结果值。
}
--------------------------------------------------------------
下一个,按顺序来看,建立队列。

STREC *creat( double *s) //返回队列头的地址(指针)。参数为指向双精度数据变量的指针。
{
STREC *h,*p,*q; //此处说明:h存放队列头地址,p存放当前访问队列节点地址(已经进入队列,或者说当前队列尾节点地址),q存放新增节点的地址(还没有进入队列);
int i=0; //初始化循环增量
h=p=(STREC*)malloc(sizeof(STREC)); //为队列头分配空间,并用指针变量记录队列头地址。可以认为,当前只有一个节点,既是头,也是尾;
p->s=0; //队列头节点中分数变量赋值为0。这是可以不这样做的。
while(i<N) //从第0个数据开始存储,一直到第N-1个数据,共计存储N个数据,将数据存储完成后退出循环
{
q=(STREC*)malloc(sizeof(STREC)); //为新节点数据分配空间,首地址保存在q中
q->s=s[i]; //将数组中第i个对应分数数据存入新节点对应位置。
i++; //循环变量自增1
p->next=q; //将新节点链接到队列尾。或者说,当前队列尾的下一个节点是上面构造的那个节点;
p=q;///重新记录或者说更新队列尾
}
p->next=0; //此处对于这种用法不发表看法;意思是,最终形成的队列“尾节点的下一个节点不存在”,就是表示队列生成完毕,此时p就是真正的队列尾,后面再也没有其它节点了。
return h; //将队列头地址返回
}
----------------------------------------------
下一个展示队列
void outlist(STREC *h)
{
STREC *p; //申明存放节点地址的指针标量
p=h->next; //取得队列中第二个节点的地址。因为在构造时,第一个节点中的分数数据是0,所以,从第二个开始打印。
printf("head"); //开始做打印提示
do
{
printf("->%2.0f",p->s); //按照定制格式打印当前节点中的分数值
p=p->next; //取得下个节点的地址
}
while(p!=0) ; //队列没有打印完的话,继续。此处用法不算标准用法。当然,原理上没有问题。
printf("\n\n");
}
-------------------------------------------------------------------------------------
最后一个
double fun( STREC *h ) //在队列中,找到最大的分数值
{
double max; //申明存放最大分数数据的变量
STREC *q=h; //申明指向队列的指针变量
max=h->s; //用队列头中的数据初始化最大分数值。即:max=0;
do
{
if(q->s>max) //用队列中的当前节点(其实是每一个节点)中的数据与当前MAX(目前选出的最大数)做比较。包括队列头重的那个'0‘,即第一次比对的时候,是if(0>0).
max=q->s; //总是存放比较大的那个数

q=q->next; //取队列中下一个节点
}
while(q!=0); //队列没有遍历完的话,继续
return max; /队列遍历完成,返回最大的那个数
}
--------------------
希望能够帮到你!
---
天啊,我早上打开楼主这个求助,我以为可能回答的人不会太多,由于我还在忙,途中吃了个饭,才慢慢过来写,结果...不过我比较了下,还是我写的要详细些。(一楼有点晕,估计他以后自己看了都会笑自己), 最重要的是,大家能帮到你,就OK了!
Jseven_jy
2011-02-24 · TA获得超过8122个赞
知道大有可为答主
回答量:2499
采纳率:100%
帮助的人:1099万
展开全部
先说一下,这段代码的整体要实现的功能,
这段代码主要包含三个功能:
(1)STREC *creat( double *s) :创建一个指向结构体STREC的链表;
(2)void outlist(STREC *h) : 输出链表中每一个STREC中变量s的值;
(3)double fun( STREC *h ) : 找出链表中所有STREC中变量s的最大值。

下面是加了注释的代码:
#include <stdio.h>
#include <stdlib.h>
#define N 8

struct slist
{
double s;
struct slist *next;
}; /*定义一个结构体slist,里面有个变量s,还有一个指针next用于指向一下slist*/

typedef struct slist STREC; /*用STREC来表示结构体slist*/

/* 找出链表中所有STREC中变量s的最大值,参数为链表的头*/

double fun( STREC *h )
{
double max;/*用于记录最大的s值*/
STREC *q=h;/*q指向传入的链表的头*/
max=h->s;/*将max初始化为链表中第一个STREC 的s的值*/
do
{
if(q->s>max)/*如果当前的结构体STREC中的s值比max要大,就把它赋值给max*/

max=q->s;

q=q->next; /*取一个结构体STREC*/
}
while(q!=0);/*依次取链表中的TREC*/
return max;
}

/*创建一个指向结构体STREC的链表;参数为一列s值*/
STREC *creat( double *s)
{
STREC *h,*p,*q;
int i=0;
h=p=(STREC*)malloc(sizeof(STREC));/*开辟一个新的空间,空间大小为结构体STREC的大小*/
p->s=0;
while(i<N) /*建立具有N个结构体STREC的链表*/
{
q=(STREC*)malloc(sizeof(STREC)); /*开辟一个新的空间,空间大小为结构体STREC的大小*/
q->s=s[i]; /*赋予s值*/
i++;/*取下一个值*/
p->next=q;/*链表连接*/
p=q; /*指向当前链表的尾*/
}
p->next=0;/*最后一个点指向0,这个可以用于判断是否已到链表结尾*/
return h; /*返回链表的头指针*/
}

/*输出链表中每一个STREC中变量s的值,参数为链表的头指针*/
void outlist(STREC *h)
{
STREC *p;
p=h->next;/*用p指向传入链表的头指针*/
printf("head");
do
{
printf("->%2.0f",p->s);/* 输出s的值*/
p=p->next; /*指向链表的下一个结点*/
}
while(p!=0);
printf("\n\n");
}

希望对你有帮助。。。。仍有问题可以HI我。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我爱涮涮锅
2011-02-24 · TA获得超过103个赞
知道答主
回答量:29
采纳率:0%
帮助的人:19万
展开全部
struct slist
{
double s;
struct slist *next;
};//创建一个结构体,包括两个部分,第一个部分是学生成绩,第二个是指向下一个结构体的指针

typedef struct slist STREC;//将这种结构体类型定义为STREC类型

double fun( STREC *h )
{ //函数实现的是在以h开头的链表中找出最高成绩
double max;
STREC *q=h;
max=h->s; //给max设置初值,即头节点的s值,可以从后面的函数中知此值为0
do
{ //开始循环查找最大值
if(q->s>max)
max=q->s;//用max记录已经查找过的值中的最大值,如果当前值比max大,就用当前值替代max,因此max始终是已查找中的最大值

q=q->next; //将指针后移,去查找下一个
}while(q!=0);//当q==0时,已经查找完毕,此时max是所有值中最大的

return max;//将max返回
}

STREC *creat( double *s)
{//此函数的作用是,将保存成绩的数组s转换成链表
STREC *h,*p,*q;
int i=0;//用来记录个数
h=p=(STREC*)malloc(sizeof(STREC));//给h和p动态申请空间,空间大小为STREC的字节数,h作为链表的头结点,p是跟踪指针,初始值就是头结点
p->s=0;//设置头结点的s值为0
while(i<N)
{//循环8次,每次新建一个节点,将s赋值
q=(STREC*)malloc(sizeof(STREC));//新建节点q
q->s=s[i];//节点的s值就是数组s中的第i个
i++;
p->next=q; //将新建的节点q插入链表尾部
p=q;//跟踪指针后移,即移到表尾,以便下次循环中插入
}
p->next=0;//已经建立好链表,设置最后一个节点的next为空
return h;
}

void outlist(STREC *h)
{ //输出链表内容,即学生成绩值
STREC *p;
p=h->next; //p是第一个有效节点
printf("head");
do
{
printf("->%2.0f",p->s);
p=p->next;
}while(p!=0);
//循环输出
printf("\n\n");
}

void main()
{
double s[N]={85,76,69,85,91,72,64,87}, max;
STREC *h;
h=creat(s); //根据数组s建立链表
outlist(h);//输出链表内容
max=fun(h);//找出链表中的最大值
printf("max=%6.1f\n",max);//将最大值输出
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
regret4hxp2
2011-02-24 · TA获得超过682个赞
知道小有建树答主
回答量:479
采纳率:100%
帮助的人:242万
展开全部
do
{
if(q->s>max)

max=q->s;

q=q->next;
}
这几行就是找出最高分的。。
不过,这个逻辑不对啊。少了一行比较表达式。
do
{
if(q->s>max)

if( max < q->s) max=q->s;//添加这一句!!

q=q->next;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式