非循环单链表执行插入之前判断条件的有关问题

非循环单链表执行插入之前判断条件的问题
在学数据结构课程<c语言版>
关于非循环单链表的插入操作:

在执行插入操作之前,要判断这个链表是否为空,插入或者删除的位置是否合适
下面几行代码完全解决了以上的问题,无论怎么插入都可以,可以说是万能公式了:

while (p && i<pos-1)   
{
p = p->pNext;
i++;
}
if (!p || i>pos-1)             
return false;



我的理解如下<不知道理解是否正确>:
     while循环语句的作用是让指针p不断的往后移动,直到p指向这个插入位置的结点,比如我要在第3个结点之前插入一个值,我先通过移动p让p指向第3个结点
     if语句就是来判断这个结点是否存在,比如你要往第3个结点之前插入一个值,这个结点都不存在,你怎么插入?

可是还有疑惑如下:
     if语句中的i>pos-1这个东西起到什么作用,while循环中的条件就是i<pos-1,无论怎么移动,i的值也不会大于pos-1啊,感觉这个条件没什么用?我只要判断此时的p是不是空不就行了吗?

最后,谢谢大家,分不多,一点心意,麻烦大家帮我分析分析!

  

------解决方案--------------------
 if语句就是来判断这个结点是否存在,比如你要往第3个结点之前插入一个值,这个结点都不存在,你怎么插入?
如果只有1个结点,要求在第3个结点之前插入一个值,神都帮不了你,p == NULL, 退出循环,  return false; 






------解决方案--------------------
如果一开始就“i>pos-1”呢?

while进不去,缺少“i>pos-1”的if也不能正确处理这种边界条件。

要考虑所有的情况。

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

能把边界条件都考虑全,是编程老鸟的标志之一。
参考网络笑话“树上还剩几只鸟”


多谢你的大力指导!能否把这个边界条件给小生详细解释下?

我现在能想到的:(也不一定全啊)
带不带头节点
空链表
第一个节点之前
最后一个节点之后
new或者malloc失败
某两个或某几个节点在内存中重叠
……


这段代码是谁写出来的,我真是佩服的五体投地。。
如果是自己写,我怎么也想不出来这样写,
感觉理解都没理解透彻。。。。。
只能不断的找数字试,试了半天这个函数就是不会down掉,真牛逼。。。。

我敢说这段代码的原作者也不是一蹴而就,而是千锤百炼之后打磨出来的。
程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George