p!= NULL 还是 P->next!=NULL

在学习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 (以上代码是错误的, 我故意写成那样,好讲解)

猜你喜欢

转载自blog.csdn.net/Mr_HCW/article/details/82056232
今日推荐