在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
第一次理解链表和节点 节点俩基本属性:节点数据、指向下一个节点的指针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; } |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论