本文目录一览:
- 1、C语言数据结构问题,刚学就不懂了
- 2、高手解答 c语言编写数据结构实例 下面的代码看不懂,高手解答
- 3、数据结构C语言版自学完全看不懂
- 4、一道C语言数据结构题,程序已给好,看不懂意思,求给分析。。注释。。重赏。。。!
C语言数据结构问题,刚学就不懂了
while(p!=NULL)
{p=p-link;++i; //这里有问题,还没有访问数据就直接将指针移到后面节点了;
sum=sum+p-data;} //这个应该写到上面,另外因为上面的原因可能会导致内存非法操作,如你操作到p指向c的时候,p此时不为NULL,但当你执行p=p-link;后,p就成为NULL了,再访问p-data就会出错的。
ave=sum/i;
return ave;}
改为:
while(!p)//从Head开始访问,直到链表结束
{
sum += p-data;//累加数据
i += 1;//计数器加1
p = p-link;//指向下一节点
}
if(i!=0)//若链表不为空,返回平均值
return sum/i;
else//若为空链表,返回0,主要是避免除0错误的发生,Good Luck!
return 0;
高手解答 c语言编写数据结构实例 下面的代码看不懂,高手解答
while(i=L.length!compare(*p++,e))
++i;
这个循环就是扫描数组找满足关系的元素的一个过程,循环条件不用解释了吧,一个是循环的边界判断条件,一个是已知的compare()函数,也就是循环的结束条件;
if(i=L.length)
这个if语句的判断条件是i=L.length,表示的是上边的循环式从中间跳出的,也就是找到找到了满足条件的元素,所以返回该元素的位序i,否则表示上面的循环已超出边界并且没有满足条件的元素,所以返回0;
Status(*compare)(ElemType,ElemType))是个函数指针;
数据结构C语言版自学完全看不懂
鄙人是计算机专业的,假期里,在我预习数据结构的时候也是看不懂。不过可以给你点建议:
1、看不懂,只有硬着头皮看,把整本书大致的看一遍,然后回头再看一遍。
2、到开这门课的班级听课,与其老师沟通,了解那些是重点,那些是了解的知识(有些小节是不用看的)。
3、网上有视频的,可以下载 《严蔚敏老师》 的视频。
数据结构确实比较难,是计算机考研科目里仅次于数学的一门,有困难是正常的。
相信你是一个自学能力很强的人,祝你学业有成。
一道C语言数据结构题,程序已给好,看不懂意思,求给分析。。注释。。重赏。。。!
你这个分不太好赚哦...真不好琢磨你哪里不懂,这就关系到注释到哪种程度.能帮你理解多少算多少吧.
为了让你方便看,我们从节点定义和主函数开始.
------------------------------------------------
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(iN) //从第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-smax) //用队列中的当前节点(其实是每一个节点)中的数据与当前MAX(目前选出的最大数)做比较。包括队列头重的那个'0‘,即第一次比对的时候,是if(00).
max=q-s; //总是存放比较大的那个数
q=q-next; //取队列中下一个节点
}
while(q!=0); //队列没有遍历完的话,继续
return max; /队列遍历完成,返回最大的那个数
}
--------------------
希望能够帮到你!
---
天啊,我早上打开楼主这个求助,我以为可能回答的人不会太多,由于我还在忙,途中吃了个饭,才慢慢过来写,结果...不过我比较了下,还是我写的要详细些。(一楼有点晕,估计他以后自己看了都会笑自己), 最重要的是,大家能帮到你,就OK了!