你这个分不太好赚哦...真不好琢磨你哪里不懂,这就关系到注释到哪种程度.能帮你理解多少算多少吧.
为了让你方便看,我们从节点定义和主函数开始.
------------------------------------------------
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了!
温馨提示:内容为网友见解,仅供参考