第一次理解鏈表和節點
節點倆基本屬性:節點數據、指向下一個節點的指針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;
}