首页 > 代码库 > C++链表

C++链表

第一次理解链表和节点

节点俩基本属性:节点数据、指向下一个节点的指针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;

 }

C++链表