【C++数据结构】线性表的顺序存储结构

文章目录


前言

线性表是计算机科学中的基本数据结构之一,它代表了一组具有线性顺序关系的元素。线性表可以使用多种不同的存储结构来实现,其中一种常见的方式是顺序存储结构。在这篇文章中,我们将深入探讨线性表的顺序存储结构,了解它的基本原理、特点以及如何在C++中实现。顺序存储结构对于数据的随机访问和简单的插入删除操作具有独特的优势,因此它在许多实际应用中都得到了广泛的应用。通过本文,您将更深入地了解顺序存储结构如何在线性表中发挥作用,以及它在实际编程中的应用。


一、顺序存储的定义

顺序存储就像是一排连续的盒子,每个盒子里都放着东西。这些盒子彼此相邻,就像挨着放在一排书架上的书一样。在计算机里,线性表的顺序存储也是类似的,它把一串数据存在一片连续的内存空间里,就像排列整齐的盒子一样,你可以直接根据位置快速找到其中的东西。这种存储方式让计算机可以快速找到、修改或者添加盒子里的东西,就像我们可以方便地找到书架上的一本特定的书一样。

那么我们还可以理解为我们的C++的原生数组,他也是顺序存储的。

二、线性表的顺序存储结构实现

2.1 存储的位置

设计思路

  • 可以用一维数组来实现顺序存储结构
  • 存储空间 : T* m_array;
  • 当前长度 : int m_length;
cpp 复制代码
template < typename T >
class SeqList : public List<T>
{
protected:
	T* m_array;
	int m_length;
}

为什么可以使用原生数组

C++中的原生数组是一种非常适合实现线性表顺序存储结构的数据类型。这是因为原生数组提供了一块连续的内存空间,使得可以按照索引(位置)来访问其中的元素,正好符合线性表顺序存储的特点。

在原生数组中,每个元素占用固定大小的内存,而这些元素按顺序依次存储在内存中。线性表中的元素也以类似的方式存储在原生数组中,每个元素在内存中的位置是连续的。这种连续存储的特性使得通过下标或索引能够直接访问并操作特定位置的元素,这正是线性表顺序存储所需的特性。

通过使用C++原生数组,您可以轻松地实现线性表的顺序存储结构,直接利用数组索引来访问、插入、删除或更新元素,这种直接的访问方式能够在常数时间内完成操作,提供了高效的数据访问。因此,原生数组在C++中是一个便捷且高效的选择,用于实现线性表的顺序存储结构。

2.2 顺序存储的get操作

顺序存储结构的元素获取操作

  • 判断目标位置是否合法
cpp 复制代码
bool ret = ((0 <= i) && (i < m_length));

让我们来解释一下:

(0 <= i) 意味着 i 必须大于或等于0,因为在大多数编程中,位置通常从0开始编号,所以不能小于0。

(i < m_length) 意味着 i 必须小于线性表的长度 m_length。这是因为线性表中的位置索引不能超过线性表的总元素个数。

这两个条件一起的意思是,我们需要确保 i 不仅大于等于0,还要小于线性表的长度,这样我们才能访问线性表中有效的位置。如果 i 不满足这两个条件,那么访问它可能导致越界错误,这是一种非常常见的编程错误,因此需要进行这样的合法性检查,以防止程序出现问题。

  • 将目标位置作为数组下标获取元素
    因为我们这是原生数组,所以直接使用下标操作即可
cpp 复制代码
e = m_array[i];

2.3 线性表的插入操作

顺序存储结构的元素插入操作

1.判断目标位置是否合法

cpp 复制代码
bool ret = ((0 <= i) && (i <= m_length));  // 1

ret = ret && (m_length < capacity());  // 1

0 <= i 确保目标位置 i 不小于0,因为位置通常是从0开始计数的。

i <= m_length 保证目标位置 i 不超过线性表的当前长度,以免越界。

m_length < capacity() 确保线性表的长度没有超过它的容量,以防止插入元素导致溢出。

这两个步骤合在一起,就是在确认插入的位置 i 是一个有效、合法的位置,不会导致数组越界或者超过线性表的容量限制。

为什么是i <= m_length呢

拿出你的手,是不是一般有5个手指,那现在有一支笔要放到你手指中间有几种方式?

有6种,所以需要i<=m_length

2.将目标位置之后的所有元素后移一个位置

cpp 复制代码
for(int p=m_length-1; p>=i; p--)   // n, 0
{
    m_array[p + 1] = m_array[p];
}

循环从线性表的最后一个元素开始,一直到目标位置 i。

m_array[p + 1] = m_array[p] 将每个元素向后移动一个位置,给插入的元素腾出空间。

这个步骤是为了给新元素腾出位置,确保插入操作不会覆盖掉原有的元素。通过将目标位置之后的元素都向后移动一个位置,为新元素腾出了插入的空间。这是线性表顺序存储结构中插入操作的一部分,确保插入后的线性表仍然是有序、没有元素遗漏的。

3.将新元素插入目标位置

4...线性表长度加 1

2.4 线性表的删除操作

顺序存储结构的元素删除操作

1,判断目标位置是否合法

cpp 复制代码
bool ret = ((0 <= i) && (i < m_length));

0 <= i 确保目标位置 i 不小于0,因为位置通常是从0开始计数的。

i < m_length 保证目标位置 i 不超过线性表的当前长度,以确保删除的位置是有效的。

这个步骤用于检查删除操作是否在合法的范围内进行,以防止删除不存在的元素或者越界。

2,将目标位置后的所有元素前移一个位置

cpp 复制代码
for(int p=i; p<m_length-1; p++)   // n - 1
 {
     m_array[p] = m_array[p+1];
 }

循环从目标位置 i 开始,一直到线性表的倒数第二个元素(m_length-1位置)。

m_array[p] = m_array[p+1] 将每个元素向前移动一个位置,覆盖掉目标位置上的元素。

这个步骤是为了删除操作。通过将目标位置之后的元素都向前移动一个位置,可以覆盖掉要删除的元素,相当于将它从线性表中删除掉。删除后,线性表中的元素仍然是连续的,没有间隙,而且长度减少了一个元素。

3,线性表长度减 1


总结

顺序存储结构是一种常见的线性表存储方式,它以连续的内存空间来存储线性表的元素,允许快速的随机访问。这种存储结构在C++编程中被广泛应用,可以用来实现数组、动态数组、以及其他线性表数据结构。通过本文,我们深入了解了顺序存储结构的原理和特点,以及如何在C++中实现它。希望本文对您更好地理解线性表的顺序存储结构以及其在实际编程中的应用有所帮助。

相关推荐
间彧8 分钟前
为什么说SimpleDateFormat是经典的线程不安全类
java
MacroZheng15 分钟前
横空出世!MyBatis-Plus 同款 ES ORM 框架,用起来够优雅!
java·后端·elasticsearch
CoovallyAIHub1 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
用户0332126663671 小时前
Java 查找并替换 Excel 中的数据:详细教程
java
间彧1 小时前
ThreadLocal实现原理与应用实践
java
若水不如远方1 小时前
Netty的四种零拷贝机制:深入原理与实战指南
java·netty
感哥1 小时前
C++ STL 常用算法
c++
用户7493636848431 小时前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java
SimonKing1 小时前
一键开启!Spring Boot 的这些「魔法开关」@Enable*,你用对了吗?
java·后端·程序员
CoovallyAIHub2 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉