第一次理解链表和节点
节点俩基本属性:节点数据、指向下一个节点的指针pNext。
链表俩基本属性:链表头指针、节点数。
链表之所以能像一条线一样连接各个节点,关键就pNext指针,链表只是一个逻辑产物罢了。
那么问题来了,节点类有个指向下一个节点的指针,下一个节点还没产生怎么指向。所以先有下一个节点,然后将当前的节点指针写在上一个节点的pNext指针里的。过程就是在添加第二个节点时,在第一个节点的pNext上写上当前的(也就是第二个节点的指针)节点指针。
所以添加一个节点后,pNext是没有写的;只有添加下一个节点才回去把上个的pNext写上。这些都是一些逻辑罢了。
这个函数实现了简单的三步:
1)寻找尾节点并将节点指针返回 ;
2)添加新节点,也就是把新的节点对象的指针给上一个节点的pNext指针,这样就能通过上一个节点找到目前的节点,那么你就算是这个链表的节点的;
3)遍历,就是把写的节点一个个访问一遍。
#include<iostream>
#include<string.h>
using namespace std;
class CNode
{
public:
CNode *pNext;
int Date;
CNode(int date)
{
pNext = NULL;
Date = date;
}
~CNode()
{
delete pNext;
pNext = NULL;
}
};
class CList
{
public:
CNode *pHeader; //一个链表的头指针,就是一个节点的指针
int NodeSum; //节点数
CList()
{
pHeader = NULL;
NodeSum = 0;
}
~CList()
{
delete pHeader;
pHeader = NULL;
}
CNode* Movetrail() //移至尾节点,并将其返回
{
CNode *Temp;
Temp = pHeader;
for(int i=1; i<NodeSum; i++)
{
Temp = Temp->pNext;
}
return Temp;
}
void AddNode(CNode* pNode) //在链尾端插入节点
{ //插入节点的过程就是把自己的
CNode *pTrail; //节点指针写到上一个节点pNext指针上
if(NodeSum == 0)
{
pHeader = pNode;
}
else
{
pTrail = Movetrail();
pTrail->pNext = pNode;
}
NodeSum++;
}
void DisplayAllNode() //遍历列表中的节点
{
CNode *Temp=pHeader;
cout<<"所有的节点按先后顺序"<<endl;
cout<<"第1个节点:"<<Temp->Date<<endl;
for(int i =1; i<NodeSum; i++)
{
Temp = Temp->pNext;
cout<<"第"<<i+1<<"个节点:"<<Temp->Date<<endl;
}
}
};
int main()
{
CNode *node1 = new CNode(520);
CNode *node2 = new CNode(1314);
CNode *node3 = new CNode(222);
CList list1;
list1.AddNode(node1);
list1.AddNode(node2);
list1.AddNode(node3);
list1.DisplayAllNode();
return 0;
}