链表进阶(含代码)

有了上次 链表基础 学习之后,这次深入一点学习链表。一般在程序中使用多的还是类,毕竟是面向对象嘛,因此此次通过两个类来创建链表:节点类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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值