C++用类的方法设计简单的单向链表
·
目录
链表是一种常用的数据结构,本文总结使用C++类的方法设计简单的单向链表。包括向为节点添加数据、便利链表中的节点和在链表结束时释放所有节点
1、设计说明
1)、定义一个节点类class CNode
至少定义该节点数据成员m_pNext、m_Data和构造函数CNode(),并初始化;
2)、定义一个链表类class CList
- 至少定义数据成员:CNode *m_pHeader 和int m_NodeSum,其中m_pHeader的数据类型是CNode类型;
- 至少定义成员函数:CNode* MoveTrail()、void AddNode(CNode* pNode)、void PassList() 和析构函数~CList() 。其中成员函数 MoveTrail()返回值CNode类型,AddNode()的形式参数是CNode类型。特别地,这些函数中的局部变量是CNode类型。
- 通过定义链表类的数据成员或成员函数及其参数或成员为节点类class CNode类型,使得链表类class CList和节点类class CNode整合在一起。
3)、单步执行调试
启动单步调试,观察并记录每步执行过程,从而学习学会单向链表的设计思想。
2、定义链表类.h或.cpp
/*定义一个链表类*/
#include<iostream>
#include<iomanip>
using namespace std;
//定义一个节点类
class cNode
{
public:
cNode* m_pNext=NULL; //定义一个节点指针,指向下一个节点
int m_Data=0; //定义节点的数据
cNode()
{
m_pNext = NULL; //将m_pnext设置为空
}
};
//定义链表类clist类
class cList
{
private:
cNode* m_pHeader; //定义头节点
int m_NodeSum; //定义节点数量
public:
cList() //定义链表的构造函数
{
m_pHeader = NULL; //初始化m_pheader
m_NodeSum = 0; //初始化m_nodesum
}
//除了首节点pTmp = m_pHeader外pTmp = pTmp->m_pNext;
cNode* MoveTrail() //移动到尾节点
{
cNode* pTmp = m_pHeader; //定义一个临时节点,cNode对象*pTmp指向m_pNext,将其指向头节点
for (int i = 1; i < m_NodeSum; i++) //遍历节点
pTmp = pTmp->m_pNext; //除首节点外pTmp始终存储着m_pNext
return pTmp; //返回尾节点
}
//在链表末尾添加节点,除空链表外pTrail->m_pNext始终指向pNode;
void AddNode(cNode* pNode)
{
if (m_NodeSum == 0) //仅链表为空时用pNode替换m_pHeader
m_pHeader = pNode; //将节点添加到头节点中
else //链表不为空
{
cNode* pTrail = MoveTrail(); //搜索尾节点,调用MoveTrail()函数,cNode对象*pTrail指向m_pNext
pTrail->m_pNext = pNode; //在尾节点处添加节点,除空链表外pTrail->m_pNext始终指向pNode;
}
m_NodeSum++; //使链表节点数量加1
}
//遍历列表
void PassList()
{
if (m_NodeSum > 0) //判断链表是否为空
{
cNode* pTmp = m_pHeader; //定义一个临时节点,将其指向头节点
printf("%4d", pTmp->m_Data); //输出节点数据
for (int i = 1; i < m_NodeSum; i++) //遍历其他节点,注意是从i=1开始的
{
pTmp = pTmp->m_pNext; //获取下一个节点
printf("%4d", pTmp->m_Data); //输出节点数据
}
}
}
//定义链表析构函数
~cList()
{
if (m_NodeSum > 0) //链表不为空
{
cNode* pDelete = m_pHeader; //定义一个临时节点,指向头节点
cNode* pTmp = NULL; //定义一个临时节点
for (int i = 0; i < m_NodeSum; i++) //遍历节点
{
pTmp = pDelete->m_pNext; //获取下一个节点
delete pDelete; //释放当前节点
pDelete = pTmp; //将下一个节点设置为当前节点
}
m_NodeSum = 0; //将m_nodesum设置为0
pDelete = NULL; //将pdelete设置为空
pTmp = NULL; //将ptmp设置为空
}
m_pHeader = NULL; //将m_pheader设置为空
}
};
3、主函数main.cpp
声明一个链表类对象,向其中添加节点,并遍历链表节点。
/*主函数*/
#include<iostream>
#include "LinkTable_Func.cpp"
using namespace std;
/*声明一个链表对象,向其中添加节点,并遍历链表节点*/
int main()
{
cList list; //定义链表对象
for (int i = 0; i < 5; i++) //利用循环向列表中添加5个节点
{
cNode* pNode = new cNode(); //构造节点对象
pNode->m_Data = i; //设置节点数据
list.AddNode(pNode); //添加节点到链表
}
list.PassList(); //遍历节点
cout << endl; //输出换行
}
/*运行结果:
0 1 2 3 4 */
4、总结
1)、一个节点至少有数据成员m_pNext、m_Data和一个构造函数;
2)、在链表里,头节点m_pHeader指向链表中第一个节点的pNode,除尾节点外的每一个节点的m_pNext均指向相邻的下一个节点的pNode;
3)、尾节点的m_pNext指向NULL;
更多推荐
所有评论(0)