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