【C/C++】使用类和对象 封装链表

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


在之前使用过结构体对链表的基本功能进行封装

【链表的增删改查基本功能】组件化封装

C++中的结构体和类很像,也可以有构造—析构函数,也有访问修饰符,继承、多态等。

类成员属性、方法默认是私有的(private),而结构体默认是公有的(public)
一般情况,使用类来描述功能实现,而结构体通常只是纯粹的表示数据。

链表有复杂的数据、很多的方法一般定义成类

而节点只是描述了持有数据的类型和指向一个节点的指针,一般被定义为结构体

在介绍过类和对象后,本文将通过类和对象的角度,将链表的属性和一些基本功能封装成类

一、创建节点

使用结构体创建节点

(结构体也有构造函数 进行节点的初始化)

//节点
struct Node
{
	int data;
	Node* pNextNode;
	//构造函数	初始化
	Node(int v)
	{
		data = v;
		pNextNode = nullptr;
	}
};

二、创建链表

创建一个链表类,并通过构造函数初始化头节点、尾节点和链表长度

//链表
class CList
{
public:
	Node* m_pHeadNode;
	Node* m_pEndNode;
	int m_nLen;

	//构造函数 初始化
	CList()
	{
		m_pHeadNode = m_pEndNode = nullptr;
		m_nLen = 0;
	}
};

析构函数用来回收节点额外申请的内存空间,并将空闲指针指向空

	//析构函数
	~CList()
	{
		Node* pTempNode = nullptr;	//临时节点 用于标记要删除的节点
		while (m_pHeadNode)
		{
			pTempNode = m_pHeadNode;	//标记头节点
			m_pHeadNode = m_pHeadNode->pNextNode;	//头节点移动
			delete pTempNode;	//删除标记的节点
		}
		pTempNode = m_pHeadNode = m_pEndNode = nullptr;
		m_nLen = 0;
	}

在类中添加链表相关功能函数

在链表尾部添加节点、在链表头部删除节点、遍历链表数据、计算链表长度

	//尾添加
	void backAdd(int data)
	{
		Node* PNode = new Node(data);
		//链表为空
		if (m_pHeadNode == nullptr)
		{
			m_pHeadNode = m_pEndNode = PNode;
		}
		else//非空链表
		{
			m_pEndNode->pNextNode = PNode;
			m_pEndNode = PNode;
		}
		m_nLen++;
		cout <<"数据"<<data << "添加成功!" << endl;
	}
	//头删除
	void frontDelete() 
	{
		if (m_pHeadNode) 
		{
			Node* pNode = m_pHeadNode;  //标记头,也是将来要删除的
			if (m_pHeadNode == m_pEndNode) 
			{  //1个节点
				m_pHeadNode = m_pEndNode = nullptr;
			}
			else 
			{  //多个节点
				m_pHeadNode = m_pHeadNode->pNextNode;//向后移动
			}
			cout << "数据" << pNode->data << "删除成功!" << endl;
			delete pNode; //删除标记的
			pNode = nullptr;
			m_nLen--;
		}
	}
	//遍历链表
	void ShowList() 
	{
		cout << "链表数据:";
		Node* pNode = m_pHeadNode;
		while (pNode) 
		{
			cout << pNode->data << "  ";
			pNode = pNode->pNextNode;//向后移动
		}
		cout << endl;
	}

	//获取链表长度
	int GetLength() 
	{
		return m_nLen;
	}

三、主函数进行测试

在主函数中使用链表类定义一个链表对象

调用类中的成员函数进行功能测试:

int main()
{
	CList list;		//创建链表对象
	//添加数据
	list.backAdd(2);
	list.backAdd(0);
	list.backAdd(2);
	list.backAdd(3);
	//遍历链表
	list.ShowList();
	//获取链表长度
	cout << "链表长度: " << list.GetLength() << endl << endl;

	//删除链表开头元素
	list.frontDelete();
	list.frontDelete();
	//遍历链表
	list.ShowList();
	//获取链表长度
	cout << "链表长度: " << list.GetLength() << endl;
	return 0;
}

运行结果

在这里插入图片描述

全部完整代码

以下是本文使用类封装链表的全部代码:

#include <iostream>
using namespace std;
//节点
struct Node
{
	int data;
	Node* pNextNode;
	//构造函数	初始化
	Node(int v)
	{
		data = v;
		pNextNode = nullptr;
	}
};
//链表
class CList
{
public:
	Node* m_pHeadNode;
	Node* m_pEndNode;
	int m_nLen;
	//尾添加
	void backAdd(int data)
	{
		Node* PNode = new Node(data);
		//链表为空
		if (m_pHeadNode == nullptr)
		{
			m_pHeadNode = m_pEndNode = PNode;
		}
		else//非空链表
		{
			m_pEndNode->pNextNode = PNode;
			m_pEndNode = PNode;
		}
		m_nLen++;
		cout <<"数据"<<data << "添加成功!" << endl;
	}
	//头删除
	void frontDelete() 
	{
		if (m_pHeadNode) 
		{
			Node* pNode = m_pHeadNode;  //标记头,也是将来要删除的
			if (m_pHeadNode == m_pEndNode) 
			{  //1个节点
				m_pHeadNode = m_pEndNode = nullptr;
			}
			else 
			{  //多个节点
				m_pHeadNode = m_pHeadNode->pNextNode;//向后移动
			}
			cout << "数据" << pNode->data << "删除成功!" << endl;
			delete pNode; //删除标记的
			pNode = nullptr;
			m_nLen--;
		}
	}
	//遍历链表
	void ShowList() 
	{
		cout << "链表数据:";
		Node* pNode = m_pHeadNode;
		while (pNode) 
		{
			cout << pNode->data << "  ";
			pNode = pNode->pNextNode;//向后移动
		}
		cout << endl;
	}

	//获取链表长度
	int GetLength() 
	{
		return m_nLen;
	}

	//构造函数 初始化
	CList()
	{
		m_pHeadNode = m_pEndNode = nullptr;
		m_nLen = 0;
	}
	//析构函数
	~CList()
	{
		Node* pTempNode = nullptr;	//临时节点 用于标记要删除的节点
		while (m_pHeadNode)
		{
			pTempNode = m_pHeadNode;	//标记头节点
			m_pHeadNode = m_pHeadNode->pNextNode;	//头节点移动
			delete pTempNode;	//删除标记的节点
		}
		pTempNode = m_pHeadNode = m_pEndNode = nullptr;
		m_nLen = 0;
	}
	
};



int main()
{
	CList list;		//创建链表
	//添加数据
	list.backAdd(2);
	list.backAdd(0);
	list.backAdd(2);
	list.backAdd(3);
	//遍历链表
	list.ShowList();
	//获取链表长度
	cout << "链表长度: " << list.GetLength() << endl << endl;

	//删除链表开头元素
	list.frontDelete();
	list.frontDelete();
	//遍历链表
	list.ShowList();
	//获取链表长度
	cout << "链表长度: " << list.GetLength() << endl;
	return 0;
}

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值