前言:
由于在某个题目中卡住了,发现对于链表的知识是有所欠缺的。(呜呜呜,不小心把有头结点的和没有头结点的指针中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的位置是整个数据的最后一个数值。
上面运行程序创建一个例子如下:
后记:
这次之后,我下次一定要好好的看题目判断了,大家也是哦。如有误,请指出,谢谢。(对了,没有释放头指针,哈哈,太懒了)