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

news/2024/11/15 1:54:30/

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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;
}

在这里插入图片描述

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

http://www.ppmy.cn/news/570504.html

相关文章

C++ 标准库 — 正则表达式 std::regex

C 标准库 — 正则表达式 std::regex 文章目录 C 标准库 — 正则表达式 std::regexI - 正则表达式概述II - 内容2.1 - 匹配字符2.2 - 匹配数量/次数2.3 - 特殊字符的用途 III - 使用3.1 - 正则表达式有不止一种写法3.2 - 内置通用字符簇特殊用法3.3 - 元字符使用3.4 - 零宽断言3…

web的get请求中一个key有多个value值的情况如何处理,qs的工具的使用

利用qs库 qs是一个流行的查询参数序列化和解析库。 可以将一个普通的object序列化成一个查询字符串&#xff0c;或者反过来将一个查询字符串解析成一个object&#xff0c;而且支持复杂的嵌套。 并且天然支持urlcode的编码和解码。非常的实用 至于http为什么需要这个URLcode的编…

伺服生产方案埃斯顿伺服

伺服生产方案埃斯顿伺服 id570658019967&

台达DVP ES系列PLC与台达MS300变频器通讯程序

台达DVP ES系列PLC与台达MS300变频器通讯程序 器件&#xff1a;台达DVP ES系列的PLC&#xff0c;台达MS300系列变频器&#xff0c;昆仑通态&#xff0c;威纶通 功能&#xff1a;实现频率设定&#xff0c;启停控制&#xff0c;实际频率读取等。 资料&#xff1a;带注释PLC程序&a…

威科达追剪专用型伺服驱动器

VEC-VC-F追剪专用型伺服内含自动追剪控制功能&#xff0c;随着加工物的进料速度&#xff0c;自动控制锯台前进速度&#xff0c;在达到设定长度时&#xff0c;进入同步区发出可裁切信号&#xff0c;将加工物锯断后发出裁切完成信号&#xff0c;锯台快速返回原点准备下一次裁切。…

帝特dt 5001/5002/5003驱动

帝特dt 5001/5002/5003驱动是官方提供的一款USB驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决USB接口不能正常识别&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8 / Windows 10 32/64位操作系统。有需要的…

步进电机驱动器一体机VSMD122_025T(北京伟恩斯技术有限公司)使用方法

简介 VSMD122_025T是运动控制和电机驱动一体化的步进电机闭环控制驱动模块。VSMD122_025T使用RS232串口总线。输入电压为12~40VDC。 串口模块 我们使用的是六合一多功能串口模块&#xff08;CP2102&#xff09;。 我们使用的是第二种模式。 电机驱动模块与串口模块接线…

台达伺服控制器接线图_【工控项目分享】台达ASDA-AB系列伺服驱动器——内部位置控制...

前期因为成本控制PLC,选择库存货&#xff0c;结果库存是继电器类型的&#xff0c; 不是晶体管&#xff0c;无法发出脉冲信号&#xff0c;但是现在工艺上需要加伺服控制器&#xff0c;而且 还是必须位置控制的那种才能实现工艺。怎么办&#xff0c;怎么办&#xff0c;怎么办&…