严祖母的《数据结构(C语言版)》在单链表 GetElem 卡住了。

严奶奶的《数据结构(C语言版)》在单链表 GetElem 卡住了。。
Status GetElem_L(LinkList L, int i, ElemType &e) {
p = L->next; j = 1; 
while (p && j<i) {
p=p->next; ++j;
}
if ( !p || j>i ) return ERROR; //第i个元素不存在
e = p->data;
return OK;
}

if条件判断看不懂,不明白为何要对 !p 和 j>i 进行或运算,如果要判断第i个元素存不存在单单看跳出循环后,p是不是空指针就可以了啊,为何要多此一举呢?难道是为了防止类似于i=1.5、2.5……这样的输入?那真是无语了。。。

万分感谢!!!
------解决思路----------------------
对 !p 和 j>i 进行或运算表示:
1、p指向的内容不能为空也就是p指向的元素存在
2、j>i表示确保你取指定位置的元素确定是第i个,例如:你传参i=0,则不存在第0个元素