在学习C语言指针的时候, 我常常会因为 "到底什么情况用p!=NULL, 什么情况用p->next!=NULL" 而头痛
我举个栗子
PNODE deleteNode(PNODE head, int data)
{
PNODE p = head, temp;
if (head == NULL)
{
printf("链表为空!\n");
return head;
}
while (p != NULL&&p->data != data){ temp = p; p = p->next; }
if (p->data == data)
{
if (p == head) head = p->next;
else temp->next = p->next;
free(p);
}
else printf("不存在\n");
return head;
}
这是指针里面常用的删除节点的函数, 那么问题来了, while里面的条件到底是p!= NULL 还是 p->next!=NULL呢?
其实这个很好判断
首先先思考什么情况下会跳出while循环呢? 无非就两种情况: 1. p==NULL 2.p->data==data(要删除的数)
情况1: 链表中不存在要删除的数
既然不存在要删除的数, 那么p->data!=data永远成立, 所以跳出循环的条件一定是当p==NULL才跳出.
假设某个时候跳出循环了,即p==NULL, 那跳出循环之后呢? 是不是就执行if(p->data==data)这条语句. 你想, 现在都p==NULL了, p哪还来的data成员变量?!, p->data本身就是一个误差的表示方式, 所以这种情况下p!=NULL绝对是错误的!!!
情况2 : 链表中存在要删除的数
既然链表中存在要删除的数, 那么p->data==data一定会在某个时候成立. 假设某个时候跳出循环了, 即p->data==data, 那一跳出循环就会执行if(p->data==data) 这条语句, 那现在p->data这种表示是否正确呢? 答案肯定是正确的. 你可能会问为什么? 那好, 我先问你为什么会跳出while循环, "不是p->data==data吗", 没错, 既然都p->data==data了, 那p->data这种表示你说正不正确. 所以这种情况下p!=NULL与p->next!=NULL并不能判断用哪种正确, 即这两种都可以用.
综上两种情况所述
while里面应该是p->next!=NULL (以上代码是错误的, 我故意写成那样,好讲解)