有了上次 链表基础 学习之后,这次深入一点学习链表。一般在程序中使用多的还是类,毕竟是面向对象嘛,因此此次通过两个类来创建链表:节点类CNode 和 链表类CList。
此次创建的链表有 向尾节点添加数据、遍历链表中的节点和在结束时释放所有的节点。
先来看 List.h
这里定义了两个类,其中CList类有3个成员函数,不太理解的可以用纸根据下面程序来一步一步演示,一定要搞懂逻辑。
#pragma once
#include<iostream>
using namespace std;
//定义一个节点类
class CNode
{
public:
CNode();
int m_Data;
CNode *m_pNext;
};
//定义一个链表类
class CList
{
public:
CList();
//找到尾节点
CNode *FindTrail()
//添加节点
void AddNode(CNode *pNode);
//遍历节点
void PassList();
~CList();
private:
CNode *m_pHeader;
int m_Nodenum;
};
List.cpp
#include "List.h"
//初始化节点的指向为NULL
CNode::CNode()
{
this->m_pNext = NULL;
}
//无参构造
CList::CList()
{
this->m_pHeader = NULL;
this->m_Nodenum = 0;//初始化节点数量为0
}
//找到尾节点
CNode *CList::FindTrail()
{
CNode *pTemp = this->m_pHeader;
for (int i = 1; i < this->m_Nodenum; i++)
pTemp = pTemp->m_pNext;
return pTemp;
}
//添加节点
void CList::AddNode(CNode *pNode)
{
//若链表原本为空,则将第一个创建的新节点作为头节点并存储数据
if (this->m_Nodenum == 0)
this->m_pHeader = pNode;
else
{
//定义一个临时指针pTrail 来接收MoveTrail函数返回的尾节点
CNode *pTrail = MoveTrail();
pTrail->m_pNext = pNode;
}
this->m_Nodenum++;
}
//遍历节点
void CList::PassList()
{
if (this->m_Nodenum > 0)
{
CNode *pTemp = this->m_pHeader;
//先输出头节点数据
cout << pTemp->m_Data << " ";
//再对后面的节点进行遍历
for (int i = 1; i < this->m_Nodenum; i++)
{
pTemp = pTemp->m_pNext;
cout << pTemp->m_Data << " ";
}
}
}
//析构函数
CList::~CList()
{
if (this->m_Nodenum > 0)
{
CNode *pDelete = this->m_pHeader;
CNode *pTemp = NULL;
//从头节点开始Delete
for (int i = 0; i < this->m_Nodenum; i++)
{
pTemp = pDelete->m_pNext;
delete pDelete;//释放当前节点
pDelete = pTemp;
}
//释放完后将节点数量置0,创建的指针指向空
this->m_Nodenum = 0;
pDelete = NULL;
pTemp = NULL;
}
this->m_pHeader = NULL;
}
最后是main.cpp
#include"List.h"
int main()
{
CList list;
//此处创建5个节点(包括头节点head)
for (int i = 0; i < 5; i++)
{
CNode *pNode = new CNode();//构造节点对象
pNode->m_Data = i;
list.AddNode(pNode);
}
//打印
list.PassList();
cout << endl;
return 0;
}
最后的结果:
要是还没看懂就回去 链表基础 看看,其实只要知道逻辑的话还是比较简单的。
参考:https://blog.youkuaiyun.com/weixin_52300539/article/details/124497957