C++实现面向对象单链表:从基本概念到完整代码
创作时间:
作者:
@小白创作中心
C++实现面向对象单链表:从基本概念到完整代码
引用
CSDN
1.
https://m.blog.csdn.net/2302_81410974/article/details/145525612
链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中。本文将详细介绍如何用C++语言实现一个面向对象的单链表,深入探讨链表的核心操作,并展示完整的代码示例。
一、单链表的基本概念
单链表是一种由节点组成的线性数据结构,其中每个节点包含数据部分和指向下一个节点的指针。与数组不同,链表的节点在内存中不要求连续存储,而是通过指针连接。因此,链表的插入和删除操作较为灵活,不需要大量的数据移动。
在C++中,我们通过类的封装特性来实现面向对象的链表,这不仅能有效管理链表的内存,还能通过封装实现更易用、更安全的操作。
二、单链表类的设计
我们将通过一个简单的C++类来实现单链表,该类包含基本的链表操作,如插入、删除、打印链表等。
1. 节点的定义
首先,我们定义了一个Node
结构体来表示链表中的每个节点。每个节点包含一个数据部分data
和一个指向下一个节点的指针next
。
struct Node {
int data; // 数据域
Node* next; // 指针域,指向下一个节点
};
2. 链表的类定义
接下来,我们定义List
类,它包含一个指向链表头部的指针phead
,以及若干成员函数来实现链表的常见操作。
class List {
private:
Node* phead; // 链表头指针
public:
// 构造函数
List() : phead(nullptr) {}
// 析构函数
~List() {
while (phead != nullptr) {
PopFront();
}
}
// 创建节点
Node* CreateNode(int x) {
Node* node = new Node;
node->data = x;
node->next = nullptr;
return node;
}
// 打印链表
void PrintList() {
Node* cur = phead;
while (cur) {
cout << cur->data << "-->";
cur = cur->next;
}
cout << "NULL" << endl;
}
// 头插法
void PushFront(int x) {
Node* newNode = CreateNode(x);
newNode->next = phead;
phead = newNode;
}
// 尾插法
void PushBack(int x) {
Node* newNode = CreateNode(x);
if (phead == nullptr)
phead = newNode;
else {
Node* tail = phead;
while (tail->next != nullptr) {
tail = tail->next;
}
tail->next = newNode;
}
}
// 头删
void PopFront() {
if (phead == nullptr)
cout << "链表为空,无法进行删除操作!" << endl;
else {
Node* del = phead;
phead = del->next;
delete del;
del = nullptr;
}
}
// 尾删
void PopBack() {
if (phead == nullptr)
cout << "链表为空,无法进行删除操作!" << endl;
else {
if (phead->next == nullptr) {
delete phead;
phead = nullptr;
} else {
Node* tail = phead;
while (tail->next->next != nullptr) {
tail = tail->next;
}
delete tail->next;
tail->next = nullptr;
}
}
}
};
三、单链表的操作实现
- PushFront: 在链表的头部插入新节点。
- PushBack: 在链表的尾部插入新节点。
- PopFront: 删除链表的头节点。
- PopBack: 删除链表的尾节点。
- PrintList: 打印链表中的所有节点。
四、测试与演示
下面的main
函数展示了如何使用上述链表类实现基本操作:
int main() {
List ls1; // 创建一个链表对象
// 进行一些操作
ls1.PushBack(1);
ls1.PushBack(2);
ls1.PushBack(3);
ls1.PushBack(4);
ls1.PushBack(5);
// 打印链表
ls1.PrintList();
// 头删除和尾删除
ls1.PopFront();
ls1.PopBack();
// 头插操作
ls1.PushFront(9);
// 打印链表
ls1.PrintList();
return 0;
}
五、链表操作的复杂度
- PushFront和PopFront:这两个操作的时间复杂度为 O(1),因为它们仅仅操作链表的头节点。
- PushBack和PopBack:这两个操作的时间复杂度为 O(n),需要遍历整个链表,直到找到尾节点。
- PrintList:打印链表的时间复杂度为 O(n),需要遍历所有节点。
六、完整代码
#include<iostream>
using namespace std;
//节点类型声明
struct Node
{
int date;
Node* next;
};
class List
{
private:
//成员变量
Node* phead;
public:
//成员函数
List() : phead(nullptr) {}//构造函数
~List()//析构函数
{
while(phead!=NULL)
{
PopFront();
}
}
Node* CreateNode(int x)//创建节点
{
Node* node=new Node;
node->date=x;
node->next=NULL;
return node;
}
void PrintList()//打印链表
{
Node *cur=phead;
while(cur)
{
cout<<cur->date<<"-->";
cur=cur->next;
}
cout<<"NULL"<<endl;
}
void PushFront(int x)//头插
{
Node*newnode=CreateNode(x);
newnode->next=phead;
phead=newnode;
}
void PushBack(int x)//尾插
{
Node*newnode=CreateNode(x);
if(phead==NULL)
phead=newnode;
else
{
Node* tail = phead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
void PopFront() //头删
{
if (phead==NULL)
cout<<"链表为空,无法进行删除操作!"<<endl;
else
{
Node* del=phead;
phead=del->next;
delete del;
del=NULL;
}
}
void PopBack() //尾删
{
if (phead== NULL)
cout<<"链表为空,无法进行删除操作!"<<endl;
else
{
if(phead->next==NULL)
{
delete phead;
phead=NULL;
}
else
{
Node* tail = phead;
while (tail->next->next != NULL)
{
tail = tail->next;
}
delete tail->next;
tail->next=NULL;
}
}
}
};
int main()
{
List ls1;
ls1.PushBack(1);
ls1.PushBack(2);
ls1.PushBack(3);
ls1.PushBack(4);
ls1.PushBack(5);
ls1.PrintList();
ls1.PopFront();
ls1.PopBack();
ls1.PushFront(9);
ls1.PrintList();
return 0;
}
七、总结
通过面向对象的方式实现单链表,我们可以更加方便和安全地进行链表操作。封装了节点管理、内存管理以及链表操作函数的类,让链表操作更加直观并且容易维护。在实际开发中,链表结构广泛应用于各种算法和数据管理系统,掌握链表的使用可以帮助我们高效地解决许多动态数据管理的问题。
希望本篇博客能够帮助你更好地理解和使用C++实现的面向对象单链表。如果你有任何问题,欢迎留言讨论!
热门推荐
科普 | 干细胞到底是什么?
7个临床案例证明:干细胞治疗这类致死疾病有巨大潜力
从辛丑到辛亥,晚清帝国最后的救赎
废水变肥水!茂名探索山区污水治理路径,擦亮乡村振兴生态底色
《逍遥游》的中心思想是什么?如何能达到逍遥的境界?答案来了
近5年评分最高的10部国产剧,《人世间》垫底,榜首实至名归
葡萄微量元素肥施用对策与施肥办法
10种隐藏美食,外地人不知道,本地人吃不够,都是“非遗”的宝贝
老詹依旧“不老”,且行且珍惜了
狗狗脊椎健康全攻略:从症状识别到日常保健
独居不要怕,玉兰香苑教你提升安全防范
郑州三日游最佳路线:嵩山少林、银基度假区、河南博物院等景点详解
双环科技装上“聪明大脑”
用情绪智力化解职场冲突:从自我管理到团队协作
掌握这些职场沟通技巧,轻松应对冲突!
叶赛宁诗歌中的俄罗斯乡村意象
叶赛宁诞辰125年:从乡村到诗坛的传奇之路
叶赛宁诗歌中的俄罗斯风情
戏曲传播新范式:直播间成新舞台,线上汇聚新观众
戏韵贺春,央视《2025年春节戏曲晚会》奉上一台传统文化盛宴
年轻人抢着看,戏曲“有戏”靠什么?
赵本山重返春晚!经典小品回顾:从《相亲》到《拜年》,再到全球巡演
赵本山携四部新作强势回归!
从贝塔魔棒到奥特手环:奥特曼变身器的进化史
特利迦奥特曼变身器:连接过去的希望之光
《和平精英》奥特曼变身攻略:信息不足,建议等待更多内容公布
迪迦的火花棱镜:变身神器大揭秘!
澳门艺术博物馆:拿破仑的艺术遗赠
拿破仑皇帝在位时间大揭秘:从加冕到滑铁卢
拿破仑时代:那些影响至今的政治改革