线性表-链式描述(C++)

链式实现的线性表:

链式实现的线性表,即链表(Linked List),是一种通过节点(Node)的集合来存储数据的线性数据结构。在链表中,每个节点包含两部分:存储数据的域(数据域)和指向下一个节点的指针(指针域)。链表中的节点通过指针相互连接,形成一个序列。

优点
  1. 动态性:链表不需要在创建时指定大小,可以动态地增加或减少节点,非常适合用于需要频繁插入和删除操作的场景。

  2. 内存利用效率高:对于稀疏的数据集,链表可以通过只存储实际存在的元素来节省内存。

  3. 灵活的插入和删除操作:在链表中,插入和删除操作通常只需要修改相邻节点的指针,而不需要移动大量的数据。这使得链表在插入和删除操作上具有较高的效率。

缺点
  1. 访问速度慢:由于链表中的节点是通过指针相互连接的,因此访问链表中的某个元素通常需要从头节点开始遍历整个链表。这使得链表的访问速度相对较慢,特别是在需要频繁访问元素的场景中。

  2. 内存开销大:链表中的每个节点都需要额外的内存来存储指针,这增加了内存的开销。特别是在双向链表中,每个节点需要两个指针,进一步增加了内存的使用。

  3. 指针管理复杂:链表的操作需要频繁地修改指针,这增加了程序的复杂性。如果不小心管理指针,可能会导致内存泄漏、指针悬挂(dangling pointer)或野指针(wild pointer)等问题。

抽象类linearList

template<typename T>
class linearList
{
public:virtual ~linearList(){};virtual bool empty() const = 0;virtual int size() const = 0;virtual T& get(const int& theIndex) const = 0;virtual int indexOf(const T& theElement) const = 0;virtual void erase(const int& theIndex) const = 0;virtual void insert(const int& theIndex,const T& theElement) = 0;virtual void optput(std::ostream& out) const = 0;
};

 节点类linkNode

template <typename T>
class linkNode
{T element;linkNode<T> *next;linkNode(){next = nullptr;}linkNode(const T& element){this->elempent = element;}linkNode(const T& element, linkNode<T>* next){this->elempent = element;this->next = next;}
};

派生类linkList

template<typename T>
class linkList : public linearList<T>
{
public:linkList(int initialCapacity = 10);linkList(const linkList<T>&);~linkList();bool empty() const;int size() const;T &get(const int &theIndex) const;int indexOf(const T &theElement) const;void erase(const int &theIndex);void insert(const int &theIndex, const T &theElement);void optput(ostream &out) const;class iterator;iterator begin(){return iterator(firstNode);}iterator end(){return iterator(nullptr);}
private:void checkIndex(const int& theIndex) const;private:linkNode<T>* firstNode;int listSize;
};
template<typename T>
linkList<T>::linkList(int initialCapacity)
{assert(initialCapacity > 0);firstNode = nullptr;listSize = 0;
}template<typename T>
linkList<T>::linkList(const linkList<T> &theList)
{listSize = theList.listSize;if(listSize == 0){firstNode = nullptr;return;}auto sourveNode = theList.firstNode;firstNode = new linkNode<T>(sourveNode->element);sourveNode = sourveNode->next;auto targetNode = firstNode;while (sourveNode != nullptr){targetNode->next = new linkNode<T>(sourveNode->next);targetNode = targetNode->next;sourveNode = sourveNode->next;}targetNode->next = nullptr;
}template<typename T>
linkList<T>::~linkList()
{while (firstNode != nullptr){auto nextNode = firstNode->next;delete firstNode;firstNode = nextNode;}
}template<typename T>
bool linkList<T>::empty() const
{return listSize == 0;
}template<typename T>
int linkList<T>::size() const
{return listSize;
}template<typename T>
T &linkList<T>::get(const int &theIndex) const
{checkIndex(theIndex);auto currentNode = firstNode;for(int i = 0; i < listSize; i++){currentNode = currentNode->next;return currentNode->element;}
}template<typename T>
int linkList<T>::indexOf(const T &theElement) const
{auto currentNode = firstNode;int index = 0;while(currentNode != nullptr && currentNode->element != theElement){currentNode = currentNode->next;index++;}if(currentNode == nullptr){return -1;}else{return index;}
}template<typename T>
void linkList<T>::erase(const int &theIndex)
{checkIndex(theIndex);linkNode<T>* deleteNode;if(theIndex == 0){deleteNode = firstNode;firstNode = firstNode->next;}else{auto p = firstNode;for(int i = 0; i < theIndex - 1; i++){p = p->next;}deleteNode = p->next;p->next = p->next->next;}listSize--;delete deleteNode;
}template<typename T>
void linkList<T>::insert(const int &theIndex, const T &theElement)
{assert(theIndex >= 0 && theIndex <= listSize);if(theIndex == 0){firstNode = new linkNode<T>(theElement,firstNode);}else{auto p = firstNode;for(int i =0; i < theIndex - 1; i++){p = p->next;p->next = new linkNode<T>(theElement,p->next);}}listSize++;
}template<typename T>
void linkList<T>::optput(ostream &out) const
{for(auto currentNode = firstNode; currentNode != nullptr; currentNode = currentNode->next){out << currentNode->element << " ";}
}template<typename T>
void linkList<T>::checkIndex(const int &theIndex) const
{assert(theIndex >= 0 && theIndex < listSize);
}template<typename T>
ostream& operator<<(ostream& out,const linkList<T>& theLinkList)
{theLinkList.optput(out);return out;
}

迭代器

template<typename T>
class iterator
{
public:typedef bidirectional_iterator_tag iterator_category;typedef ptrdiff_t difference_type;iterator(linkNode<T>* theNode = nullptr){node = theNode;}T& operator*() const{return node->element;}T* operator->() const{return &node->element;}iterator& operator++(){node = node->next;return *this;}iterator operator++(int){auto old = *this;node = node->next;return old;}bool operator!=(const iterator right) const{return node != right.node;}bool operator==(const iterator right) const{return node == right.node;}protected:linkNode<T>* node;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙定位的MATLAB仿真程序|基于信号强度的定位,平面、四个蓝牙基站(附源代码)

这段代码通过RSSI信号强度实现了蓝牙定位&#xff0c;展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出&#xff0c;用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原…

机器学习算法(六)---逻辑回归

常见的十大机器学习算法&#xff1a; 机器学习算法&#xff08;一&#xff09;—决策树 机器学习算法&#xff08;二&#xff09;—支持向量机SVM 机器学习算法&#xff08;三&#xff09;—K近邻 机器学习算法&#xff08;四&#xff09;—集成算法 机器学习算法&#xff08;五…

Attention显存统计与分析

Attention显存估计 简单的Attention函数 import torch import torch.nn as nn import einops class Attention(nn.Module):def __init__(self, dim, num_heads8, qkv_biasFalse, qk_scaleNone, attn_drop0., proj_drop0.):super().__init__()self.num_heads num_headshead_d…

Spring系列之批处理Spring Batch介绍

概述 官网&#xff0c;GitHub A lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems. 执行流程 实战 假设有个待处理的任务&#xff0c;如文件batch-tes…

[保姆式教程]使用labelimg2软件标注定向目标检测数据和格式转换

定向目标检测是一种在图像或视频中识别和定位对象的同时&#xff0c;还估计它们方向的技术。这种技术特别适用于处理有一定旋转或方向变化的对象&#xff0c;例如汽车、飞机或文本。定向目标检测器的输出是一组旋转的边界框&#xff0c;这些框精确地包围了图像中的对象&#xf…

Socket编程:UDP网络编程项目

目录 一、回显服务器 二、翻译器 三、聊天室 一、回显服务器 项目介绍&#xff1a;使用UDPIPv4协议进行Linux网络编程&#xff0c;实现回显服务器和客户端 功能介绍&#xff1a;客户端发送数据&#xff0c;经过服务端再返回到客户端&#xff0c;输出数据 源代码&#xff1…

SQL面试题——抖音SQL面试题 最近一笔有效订单

最近一笔有效订单 题目背景如下,现有订单表order,包含订单ID,订单时间,下单用户,当前订单是否有效 +---------+----------------------+----------+-----------+ | ord_id | ord_time | user_id | is_valid | +---------+----------------------+--------…

HarmonyOS4+NEXT星河版入门与项目实战(24)------Stage模型

文章目录 1、概念2、配置文件1、全局配置文件2、模块配置文件3、UIAbility生命周期1、图文归纳2、生命周期方法入口4、页面生命周期1、图文描述1、概念 2、配置文件 1、全局配置文件 2、模块配置文件 统一修改配置文件技巧:点击任意json 文件,选择 Open editor ,在显示的列表…

torch_geometric使用手册-Heterogeneous Graph Learning(专题三)

大量的现实世界数据集以异构图(Heterogeneous Graph) 的形式存储,这促使了在PyG中引入专门的功能。例如,大多数推荐系统中的图(如社交图)都是异构图,它们存储着关于不同类型的实体及其不同类型关系的信息。本教程介绍了如何将异构图映射到PyG中,以及如何将其作为输入用于…

手机实时提取SIM卡打电话的信令声音-蓝牙电话如何适配eSIM卡的手机

手机实时提取SIM卡打电话的信令声音 --蓝牙电话如何适配eSIM卡的手机 一、前言 蓝牙电话的海外战略中&#xff0c;由于海外智能手机市场中政策的差异性&#xff0c;对内置eSIM卡的手机进行支持是非常合理的需求。Android系列手机中&#xff0c;无论是更换通信运营商&#xf…

QT6学习第五天 第一个QT Quick程序

QT6学习第五天 第一个QT Quick程序 概述创建Qt Quick程序使用Qt资源文件程序发布 概述 如果将程序的用户界面成为前端&#xff0c;程序的数据存储和逻辑业务成为后端&#xff0c;那么传统QT Widgets程序的前后端都是用C完成的。对于现代软件开发而言&#xff0c;前端演化速度远…

LabVIEW内燃机气道试验台测控系统

基于LabVIEW软件开发的内燃机气道试验台测控系统主要应用于内燃机气道的性能测试和数据分析&#xff0c;通过高精度的测控技术&#xff0c;有效提升内燃机的测试精度和数据处理能力。 项目背景 随着内燃机技术的发展&#xff0c;对其气道性能的精准测量需求日益增加。该系统通…

flutter底部导航栏中间按钮凸起,导航栏中间部分凹陷效果

关键代码: Scaffold中设置floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked和extendBody: true&#xff0c; BottomAppBar中设置shape: const CircularNotchedRectangle() Scaffold(extendBody: true,//body是否延伸脚手架底部&#xff0c;在底部导航…

108.【C语言】数据结构之二叉树查找值为x的节点

目录 1.题目 代码模板 2.分析 分类讨论各种情况 大概的框架 关键部分(继续递归)的详解 递归调用展开图 3.测试结果 其他写法 4.结论 5.注意事项 不推荐的写法 1.题目 查找值为x的节点并返回节点的地址 代码模板 typedef int BTDataType; typedef struct BinaryT…

算法刷题Day1

BM47 寻找第k大 第一天就随便记录吧&#xff0c;万事开头难&#xff0c;我好不容易开的头&#xff0c;就别难为自己&#xff0c;去追求高质量了。嘿嘿嘿 题目 传送门 解题思路一&#xff1a;维护一个大小为k的最小堆。最后返回堆顶元素。 代码&#xff1a; # # 代码中的类名…

十五、linux之搭建JavaEE环境

1 概述 如果需要在 Linux 下进行 JavaEE 的开发&#xff0c;我们需要安装如下软件 2 安装 JDK 安装步骤 mkdir /opt/jdk mkdir /opt/jdk通过 xftp6 上传到 /opt/jdk 下 cd /opt/jdk 解压 tar -zxvf jdk-8u261-linux-x64.tar.gz tar -zxvf jdk-8u261-linux-x64.tar.…

基于PHP的音乐网站的设计与实现

摘 要 本系统采用PHP编程语言和MySQL数据库技术搭载了Apache服务器&#xff0c;完成了基于PHP的音乐网站设计&#xff0c;通过此次毕 业论文的撰写我明白了对于论文的选题要精确&#xff0c;要明确&#xff0c;要有明确的见解&#xff0c;要有足够的论证和创意&#xff0c;必须…

mysql 触发器进入历史

一、触发器 MySQL 触发器&#xff08;Triggers&#xff09;是一种数据库对象&#xff0c;它与表关联&#xff0c;能在特定的事件&#xff08;如插入、更新或删除&#xff09;发生时自动执行一些指定的操作。使用触发器可以帮助我们自动维护数据库的完整性、一致性&#xff0c;…

Re-squiggle算法

Re-squiggle算法 从纳米孔读取产生的电流信号水平数据被称为“squiggle”。基于这种squiggle信息进行碱基调用通常会与参考序列存在一些错误。Re-squiggle算法定义了一种新的从squiggle到参考序列的分配,因此称为re-squiggle。 Re-squiggle算法是Tombo框架的基础。该算法以包…

Springboot项目搭建(8)-用户登出与个人中心修改

1.提要信息 1.1 catch和then方法 then和catch是JavaScript中Promise对象的两个方法&#xff0c;用于处理异步操作的成功&#xff08;成功回调&#xff09;和失败&#xff08;失败回调&#xff09;情况。这两个方法通常与async/await语法一起使用&#xff0c;但也可以单独使用…