学习数据结构遇到的几个问题

guizi1234 2013-04-03 01:12:31
这是《大话数据结构》上获取单链表一个元素的程序:
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p; /*声明一个结点*/
p = L->data; /*让p指向链表的第一个结点*/
j = 1;
while(p && j<i) /*p不为空或者计数器j还没有等于i时循环继续*/
{
p = p->next; /*让p指向下一个结点*/
j++;
}
if(!p || j>i)
{
return ERROR; /*第i个元素不存在*/
}
*e = p->data; /*取第i个元素的数据*/
return OK;
}

我不明白的是if(!p || j>i)中的j>i在这儿有意义吗?因为上面这个while(p && j<i)循环中跳出循环的时候j最大和i相等啊,所以if(!p || j>i)中的j>i应该是没有意义的吧??


还是这段程序,我不明白既然书上书的i的初始条件是1<=i<=Listlength(L),那么为什么会出现第i个数据不存在的情况呢?每个节点的数据域不都是有数据的吗?第i个数据不存在是什么情况呢?
...全文
273 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
少乔 2013-04-03
  • 打赏
  • 举报
回复
你的第三个注释就说错了,/*p不为空或者计数器j还没有等于i时循环继续*/ 这句话里面的“或者”应该改成“并且”。if(!p || j>i)这个是非常有意义的,如果说上面p就为NULL,那while循环就不会进了,直接是走if(!p || j>i)这一步的,这一步是错误处理,程序提示你函数运行出错,也就是没有执行成功
shen_wei 2013-04-03
  • 打赏
  • 举报
回复
这样是为了更安全。。i是传入的值,谁能保证就正确哪? 多做判断是为了安全,但要合理!
_sunshine 2013-04-03
  • 打赏
  • 举报
回复
1.如果没有if(!p || j>i)就会return OK啦 2.i是程序写作者传参进去的,并不一定就是1<=i<=Listlength(L),所以判断出现第i个数据不存在的情况是为了防止传参错误
Leon粑粑 2013-04-03
  • 打赏
  • 举报
回复
首先 第一个问题, while的终止条件时(p不为真 || j >= i);;;;也就是说 当程序跳出while循环的时候得再判断它是为什么跳出来的 是因为节点p的不存在呢 还是i 的越界... 第二个问题..出现上面这种情况(你代码没有给全).有可能是你对书上的代码进行移植的时候,指针跑飞了....十有八九是你代码的其他地方出现了问题... PS.我们这学期也修数据结构 哈哈 .
reFreever 2013-04-03
  • 打赏
  • 举报
回复
在while循环中若p为空也是可以跳出来的,不一定就是j=i的时候。参数i是有效数据的长度?
Carl_CCC 2013-04-03
  • 打赏
  • 举报
回复
其实吧j>i确实没必要,但是能有时候加多点条件,可以让程序更安全,比如当i=0但是呢p忘记设置为=NULL了,运行到后面就死了,所以更安全些。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧