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

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

你这个分不太好赚哦...真不好琢磨你哪里不懂,这就关系到注释到哪种程度.能帮你理解多少算多少吧.
为了让你方便看,我们从节点定义和主函数开始.
------------------------------------------------
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了!
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-24
先说一下,这段代码的整体要实现的功能,
这段代码主要包含三个功能:
(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我。。。
第2个回答  2011-02-24
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);//将最大值输出
}
第3个回答  2011-02-24
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;
}

刚看完c语言,现在看数据结构感觉好难看不懂,请教高手指点!
其实initsack这样的函数 当你培养了一定的写代码能力,这些源代码也可以自己写的。同时在C++的STL库存在着类似线性表,串等类型,里面包含了类似像inistack的函数,可以直接调用。开始看的时候,这些函数可以想抽象点,先不管他怎么实现,先了解其函数作用及表面的算法思路即可。

一个有关C语言(数据结构)程序设计题 高手请帮忙,高分!
int Locate(MGraph G,char c){ for(int i=0;i<G.vexnum;i++)if(G.vexs[i]==c) return i;return -1;} \/\/创建无向网 void CreateUDN(MGraph &G){ int i,j,w,s1,s2;char a,b,temp;printf("输入顶点数和弧数:");scanf("%d%d",&G.vexnum,&G.arcnum);temp=getchar(); \/\/...

c语言 数据结构 本人不才看不出问题 ,希望各位大虾指教,谢谢、、请说...
sequenlist *L=NULL; \/\/这里声明了一个指针,最好赋上初值NULL char ch = 'a';int k ;\/\/L指针在没有指定有效地址空间时,是不能直接使用的!不然它指向的是NULL不能操作 L=(sequenlist *)malloc( sizeof(sequenlist) ); \/\/为指针分配一个有效的空间才可以用哦 ...printf("插入A B C D...

数据结构c语言版一道题求解
include <stdio.h>#include <stdlib.h>typedef int DataType; struct SeqList{ int MAXNUM; \/* 顺序表中最大元素的个数*\/ int n; \/* 存放线性表中元素的个数n≤MAXNUM *\/ DataType *element; \/* element[0],element[1],…,element[n - 1]存放线性表中的元素 ...

C语言程序注释
C语言编程规范-注释 规则:1:一般情况下,源程序有效注释量必须在20%以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、...

用C语言编程,数据结构题 要快!答的好再加更多悬赏
include <stdio.h> include <stdlib.h> typedef int ElemType;typedef struct LNode { ElemType date;struct LNode *next;}linklist,*link;\/*构造链表*\/\/\/ void IinitList(link &L){ if(L)delete L;L= (link)malloc(sizeof(LNode)) ;if (!L) exit(1);L->next=NULL;printf("链表已...

跪求数据结构 c语言程序的每段加上注释。。 注释啊 注释!!!
int j,k; \/\/声明整型变量j,k \/\/建堆函数 void build(int *a,int i,int n){ \/\/声明a为一个整型变量指针 int tmp;k=i;j=2*k+1;while(j<=n){ \/\/while 计算机的一种基本循环模式。 当满足条件时进入循环,不满足跳出 if((j<n)&&a[j]=a[j])break; \/\/break跳出循环 \/\/...

一道数据结构(c语言描述)题,希望大佬帮我看看,萌新不会?
double r,i;};PLU plu_add(PLU a,PLU b,char c){\/\/运算函数 PLU t;if(c=='+'){\/\/+ t.r=a.r+b.r;t.i=a.i+b.i;} else if(c=='-'){\/\/- t.r=a.r-b.r;t.i=a.i-b.i;} else if(c=='*'){\/\/ t.r=a.r*b.r-a.i*b.i;t.i=a.r*b.i+b.r*a.i;...

数据结构题,设计算法在整型数组A[n]中查找值为K的元素,分析时间复杂...
从头开始扫描,并设一个变量find=0,如果找到了一个值等于K,输出相应位置,如果一直扫描到结尾还是没有符合条件的值,输出-1。算法复杂度为O(n)。C语言版程序:include <stdio.h>#define n 100 \/\/这个值可以根据n的大小改#define n 10 \/\/这个值可以根据k的大小改main(){int i;long a[n+1...

数据结构(C语言版),带头结点的单链表,初始化。不懂的在算法里批注了...
viod CreateList_L(Linklist &L,int n){ \/\/逆位序输入n个元素的值 这是写程序的人的注释 逆序体现在插入数据时,不是在尾部追加,而是从头部加入 每次输入的数据结点,都会成为当前的数据头 正向遍历数据(表头到表尾)时,所显示的数据与录入的顺序是相反的。L=(Linklist)malloc(sizeof(Lnode...

相似回答