单向链表获取元素问题

时间:2021-02-24 14:54:33
下面这些代码是书本的,有点不明白。 问题一:代码中的j有可能大于i吗?为什么用这条语句if(!p||j>i)。 问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行e=p->data;对吗?

Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p=L->next; //初始化p使得其指向第一个节点
int j=1; //j为计数器
while(p&&j<i)
{
p=p->next;   //顺着指针p查找,直到找到指定位置元素或p为空
++j;
}

if(!p||j>i)
     return ERROR;
e=p->data;
return OK;
}

7 个解决方案

#1


问题一:代码中的j有可能大于i吗?为什么用这条语句if(!p||j>i)、
有可能,例如进来的i是0,不过这个判断的确不对,应该是j>=i

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行e=p->data;对吗?
不对,因为if为真时,return了

#2


问题一:代码中的j有可能大于i吗?当你给的i是一个非法的数值时就会出现这种情况,例如i=-1
问题二:因为if(!p||j>i)已经过滤掉了p为NULL的情况,所以不用加else
当然为了程序逻辑清楚,可以加else

#3


问题一:代码中的j有可能大于i吗?为什么用这条语句if(!p||j>i)。
可以看看前面的while循环while(p&&j<i), 循环条件为p不为NULL且计数器j还没有指到第i个节点.
从这点来讲, j是不可能大于i的.当p不为NULL,j==i时,循环退出,这时p指到链表的第i个节点.
但是,同时又要注意到i是参数, 传进来的i有可能小于1.
再看if(!p||j>i),这里的条件判断是在while循环结束之后,上面已经讲了while循环退出有两个出口:
或者p为NULL,或者j>=i.这里if条件判断p为NULL(表示i没有超出了链表的长度),或者j>i(传递进来的参数i小于1),满足条件之一都直接return ERROR.

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行e=p->data;对吗?
这个不需要加else,因为上面的if语句条件成立时,函数将直接返回.后面的e=p->data都不会执行.只有当if语句条件为假时,即找到了第i个节点, 此时i和j的关系应该为i==j,e=p->data才能执行.

#4


huanmie_09讲得有理赞

#5


问题一:代码中的j有可能大于i吗?
有可能。传入的i可能是负数,0,1,2……
如果传入的参数为<=0的数,那么就会出现j>i的情况;就会return ERROR;
如果传入的参数是1,那么第一个while循环的条件不满足,跳过,直接判断p是否为空,如果p不为空,则返回
p->data,否则返回ERROR;

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行e=p->data;对吗?
同意3楼的观点。如果执行了return语句,则其后的语句都不会执行。即如果(!p||j>i)的值为真,则直接返回,不会执行e=p->data;语句;只有当(!p||j>i)的值为假时,才会执行e=p->data;语句。

#6


引用 5 楼 xiaoyusmile 的回复:
问题一:代码中的j有可能大于i吗?
有可能。传入的i可能是负数,0,1,2……
如果传入的参数为<=0的数,那么就会出现j>i的情况;就会return ERROR;
如果传入的参数是1,那么第一个while循环的条件不满足,跳过,直接判断p是否为空,如果p不为空,则返回
p->data,否则返回ERROR;

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行……

补充:
如果传入的参数i>1,则不会出现j>i的情况,只需判断p是否为空即可。

#7


书中还有句话“若1<=i<=n.while循环频度为i-1,否则为n.”当i<0时while循环体中语句频度为零,也就是不执行while循环里边的语句了。那书中的这句话不就有问题了吗?

#1


问题一:代码中的j有可能大于i吗?为什么用这条语句if(!p||j>i)、
有可能,例如进来的i是0,不过这个判断的确不对,应该是j>=i

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行e=p->data;对吗?
不对,因为if为真时,return了

#2


问题一:代码中的j有可能大于i吗?当你给的i是一个非法的数值时就会出现这种情况,例如i=-1
问题二:因为if(!p||j>i)已经过滤掉了p为NULL的情况,所以不用加else
当然为了程序逻辑清楚,可以加else

#3


问题一:代码中的j有可能大于i吗?为什么用这条语句if(!p||j>i)。
可以看看前面的while循环while(p&&j<i), 循环条件为p不为NULL且计数器j还没有指到第i个节点.
从这点来讲, j是不可能大于i的.当p不为NULL,j==i时,循环退出,这时p指到链表的第i个节点.
但是,同时又要注意到i是参数, 传进来的i有可能小于1.
再看if(!p||j>i),这里的条件判断是在while循环结束之后,上面已经讲了while循环退出有两个出口:
或者p为NULL,或者j>=i.这里if条件判断p为NULL(表示i没有超出了链表的长度),或者j>i(传递进来的参数i小于1),满足条件之一都直接return ERROR.

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行e=p->data;对吗?
这个不需要加else,因为上面的if语句条件成立时,函数将直接返回.后面的e=p->data都不会执行.只有当if语句条件为假时,即找到了第i个节点, 此时i和j的关系应该为i==j,e=p->data才能执行.

#4


huanmie_09讲得有理赞

#5


问题一:代码中的j有可能大于i吗?
有可能。传入的i可能是负数,0,1,2……
如果传入的参数为<=0的数,那么就会出现j>i的情况;就会return ERROR;
如果传入的参数是1,那么第一个while循环的条件不满足,跳过,直接判断p是否为空,如果p不为空,则返回
p->data,否则返回ERROR;

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行e=p->data;对吗?
同意3楼的观点。如果执行了return语句,则其后的语句都不会执行。即如果(!p||j>i)的值为真,则直接返回,不会执行e=p->data;语句;只有当(!p||j>i)的值为假时,才会执行e=p->data;语句。

#6


引用 5 楼 xiaoyusmile 的回复:
问题一:代码中的j有可能大于i吗?
有可能。传入的i可能是负数,0,1,2……
如果传入的参数为<=0的数,那么就会出现j>i的情况;就会return ERROR;
如果传入的参数是1,那么第一个while循环的条件不满足,跳过,直接判断p是否为空,如果p不为空,则返回
p->data,否则返回ERROR;

问题二:在e=p->data;之前是不是要加个else,不然不管怎样总会执行……

补充:
如果传入的参数i>1,则不会出现j>i的情况,只需判断p是否为空即可。

#7


书中还有句话“若1<=i<=n.while循环频度为i-1,否则为n.”当i<0时while循环体中语句频度为零,也就是不执行while循环里边的语句了。那书中的这句话不就有问题了吗?