讨论p!=NULL和p->next!=NULL的区别(重点想了解最后p指针的位置)

前言:

     由于在某个题目中卡住了,发现对于链表的知识是有所欠缺的。(呜呜呜,不小心把有头结点的和没有头结点的指针中p指针在循环后指向的位置弄错了)。所以这里就利用编译器重新设置了实验组,请看代码(C++):

#include<iostream>
using namespace std;

typedef struct LNode{//首先我们定义结构体 
	int data;
	struct LNode *next;
}LNode, *LinkList;


void Creat_L(LinkList &L)//创建链表,尾插法 。为了实验数据符合我们的直观,就用尾插
//当然,头插也可以,只是不直观。
{
	L = new LNode;//带有头结点的链表
	LNode *r = new LNode;//定义尾指针 
	r = L; 
	L->next = NULL; 
	int n;
	cout<<"请输入创建的数量"<<endl;
	cin>>n;
	while(n>0)
	{
		int i;
		cin>>i;//输入数据 
		LNode *p = new LNode;//new一个新节点	
		p->data = i;//赋值新节点 
		p->next = r->next;
		r->next = p;
		r = r->next;
		n--;
	}
}

void Print1(LinkList &L)//用p!=NULL
{
	LNode *p = new LNode; 
	p = L->next;
	while(p!= NULL)
	{
		cout<<" "<<p->data;
		p = p->next;
	}
	cout<<endl;
	if(p==NULL)
	{
		cout<<"该位置是空的!"<<endl; 
		cout<<"那么指针位置是"<<&p<<endl; 
	}
	else{
	cout<<"用p->next!=NULL最后p指针位置在数据: "<<p->data<<" 位置"<<endl; 
		}
}
void Print2(LinkList &L)//用p->next!=NULL
{
	LNode *p = new LNode;
	p = L->next;
	while(p->next!= NULL)
	{
		cout<<" "<<p->data;
		p = p->next;
	}
	
	cout<<endl;
		if(p==NULL)
	{
		cout<<"该位置是空的!"<<endl; 
		cout<<"那么指针位置是"<<&p<<endl; 
	}
	else{
	cout<<"用p->next!=NULL最后p指针位置在数据: "<<p->data<<" 位置"<<endl; 
	p = p->next;
	cout<<"用p->next!=NULL最后p->next指针位置在数据: "<<&p<<" 位置"<<endl;
		}
}

int main()
{
	LinkList L1;
	Creat_L(L1);
	cout<<"用p!=NULL输出"<<endl; 
	Print1(L1);
	cout<<endl;
	cout<<"用p->next!=NULL输出"<<endl; 
	Print2(L1);
	return 0;
}

思路解析如下:

     首先创建了单链表函数,然后创建两个打印函数,因为我想要了解的是p!=NULL和p->next=NULL的区别和循环之后p指针处于什么位置所以将不同之处设置在打印函数位置,改变while循环的条件

     首先自己思考指针位置,然后你就会发现,如果用p!=NULL那么所以的数据都会被打印出来,而且p最后的位置是空的;相反,用p->next!=NULL,最后判断的时候,最后一个位置就不会被打印出来。此时循环结束时p的位置是整个数据的最后一个数值。

     上面运行程序创建一个例子如下:

后记:

     这次之后,我下次一定要好好的看题目判断了,大家也是哦。如有误,请指出,谢谢。(对了,没有释放头指针,哈哈,太懒了)

发布了93 篇原创文章 · 获赞 193 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/104371189