【更新】
2012-08-17,添加问题解析以及代码下载链接
【本栏目的】学习过程中,遇到的问题,在本栏一一记录,希望可以得到指点,交流学习。
【问题描述】
有这样一段代码,
DListNode *dlist_get_node(DList *thiz, size_t index, int fail_return_last)
{
DListNode *iter = thiz->fisrt;
while(iter!=NULL && iter->next!=NULL && index>0)
{
iter = iter->next;
index--;
}
if(!fail_return_last)
{
iter = index>0 ? NULL:iter;
}
return iter;
}
当fail_return_last为1时,下列代码不执行:
if(!fail_return_last)
{
iter = index>0 ? NULL:iter;
}
当fail_return_last为0时,执行上述代码。其实就是加了一个对index的判断,看执行了index--后,index是否不再满足index>0的条件。
问题:对fail_return_last标志的判断,是起什么作用呢?希望有高手可以指点一二,相互学习。
【解析 2012-08-17】
这段代码实质上,是依据索引index查找结点。若fail_return_last为0,则执行检查,正常的情况下,直到index为0时,while循环才会结束。但也可能会出现失败的情况,例如iter==NULL 或 iter->next == NULL。在插入结点的过程中,如果要利用索引定位光标,可以考虑使用该函数定位,但iter == NULL或iter->next == NULL,并不会造成无法插入的情况。所以插入操作,不需要进行fail_return_last检查,方法是传参数时,将fail_return_last置位1。但类似于根据索引获取/设置/删除结点的值,显然就不允许iter == NULL的情形了。这是就需要进行fail_return_last检查。
【代码下载】
http://download.youkuaiyun.com/detail/tandesir/4492717
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.youkuaiyun.com/tandesir