目录

1、设计说明

1)、定义一个节点类class CNode

2)、定义一个链表类class CList

3)、单步执行调试

2、定义链表类.h或.cpp

3、主函数main.cpp

4、总结


        链表是一种常用的数据结构,本文总结使用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;

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐