创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |