目录

一.线性表

二.顺序表

1.概念

 2.结构

3.要实现的接口函数

三.模拟实现顺序表

1.定义出顺序表的基本结构

2.实现检查扩容功能

3.实现尾插

4.实现尾删

5.实现头插和头删

6.查找

7.修改

8.遍历

9.在指定位置插入和删除

四.顺序表的优缺点及思考

 a.顺序表的弊端


一.线性表

  在谈顺序表前,我们要先说说线性表了,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

  线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

  说白了,线性表在逻辑上就是一条线性结构,数据之间的排列是一个接一个的,尽管它们在物理上不一定是线性的;

如下图所示两种线性表的逻辑结构,它们的数据看起来都是首尾相连的;

二.顺序表

1.概念

  顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

 2.结构

   顺序表可以分为静态顺序表和动态顺序表,静态顺序表采用定长数组的形式来存储元素,而动态顺序表则可以根据需要进行扩容,相对而言还是动态顺序表更加实用,我们这里实现的也是动态顺序表。

  静态与动态顺序表的结构示意如下(c语言版)

  其中,SLDataType是表示指定类型的宏定义,在c++中可以用模版来代替!size为有效元素的个数,capacity为数组的容量,不够时可以通过realloc扩容;

3.要实现的接口函数

三.模拟实现顺序表

  模拟实现我们采用c++的方式来,因为写起来更方便,而且初始化和销毁都包含在构造函数和析构函数中了,无需我们手动调用;

1.定义出顺序表的基本结构

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstdlib>
#include <assert.h>
using namespace std;
using DataType = int;
class seqList
{
public:seqList():_num(nullptr),_size(0),_capacity(0){}~seqList(){delete(_num);_size = 0;_capacity = 0;}private:DataType* _num;int _size;int _capacity;
};

2.实现检查扩容功能

  因为我们往数组里添加数据可能遇到数组空间不够的情况,所以要能检测到这种需要进行扩容的情况!

void SeqListCheckCapacity()
{if (_size == _capacity){int newcapacity = _capacity == 0 ? 4 : _capacity * 2;DataType* tmp = (DataType*)realloc(_num, sizeof(DataType) * newcapacity);if (tmp == nullptr){perror("扩容出错:");return;}_num = tmp;_capacity = newcapacity;}
}

3.实现尾插

  插入数据之前,要先检查一下当前是否需要扩容了,这样能够确保空间足够,插入数据之后不要忘记维护代表元素个数的_size;

void SeqListPushBack(DataType x)
{SeqListCheckCapacity();_num[_size++] = x;
}

4.实现尾删

  删除数据前要先确保数组内还有剩余数据,如果有,只需要将元素个数减一即可,因为我们查找和遍历顺序表时都是通过_size来进行的!

void SeqListPopBack()
{assert(_size > 0);_size--;
}

5.实现头插和头删

   只要是插入,就要首先判断扩容,只要是删除,就要先判断是否有数据;

   头插和头删的共同点是都要移动元素,对于头插,我们在顺序表头部插入元素之前,必须将原来的所有数据整体往右移一位,才能给插入数据腾出空间,此时要头插注意移动的方法,必须是从右往左进行的,每次都选取要移动到的位置,然后将左边的数移到该位置;如果从左往右依次移动,会出现左边值覆盖右边值的情况!

  尾删要先将数据向左集体移动一位,采用从左往右依次移动一位的方式;

void SeqListPushFront(DataType x)
{SeqListCheckCapacity();for (int i = _size; i > 0; i--){_num[i] = _num[i - 1];}_num[0] = x;_size++;
}
void SeqListPopFront()
{assert(_size > 0);for (int i = 0; i < _size - 1; i++){_num[i] = _num[i + 1];}_size--;
}

6.查找

  没啥好说的,就是遍历数组找关键值

int SeqListFind(DataType x)
{for (int i = 0; i < _size; i++){if (_num[i] == x){return i;}}return -1;}

7.修改

void SeqListModity(int pos,DataType x)
{assert(pos >= 0 && pos < _size);_num[pos] = x;
}

8.遍历

	void SeqListPrint(){for (int i = 0; i < _size; i++){printf("%d ", _num[i]);}}

9.在指定位置插入和删除

要注意的地方前面都已经强调过了,就是要注意插入前的检查扩容、元素的移动方式、size的维护、删除前的检查剩余数据

void SeqListInsert(int pos, DataType x)
{assert(pos >= 0 && pos < _size);SeqListCheckCapacity();for (int i = _size; i > pos; i--){_num[i] = _num[i - 1];}_num[pos] = x;_size++;
}
void SeqLIstDelete(int pos)
{assert(pos >= 0 && pos < _size);for (int i = pos; i < _size - 1; i++){_num[i] = _num[i + 1];}_size--;
}

四.顺序表的优缺点及思考

 a.顺序表的弊端

1. 中间/头部的插入删除,由于要整体移动元素,所以时间复杂度为O(N)
2. 由于realloc的特性:

  1. 原地调整:如果原内存块后有足够的空间,realloc会直接扩展内存块,而无需移动数据。
  2. 重新分配:如果原内存块后空间不足,realloc会分配一块新的内存,并将原数据复制到新内存中,同时释放原内存块。

所以增容可能需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到  200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

b.顺序表的优点

  1.随机访问效率高

  顺序表最大的优点是支持随机访问,通过下标可以直接访问任意位置的元素,时间复杂度为O(1)。这使得顺序表在需要频繁查找或按索引访问元素的场景中表现出色,比如数组操作。

  2.存储密度高

  顺序表在内存中是连续存储的,不需要额外的空间来存储元素之间的逻辑关系,因此存储密度高。相比链表等结构,顺序表在存储相同数量元素时占用的内存更少。

  3.缓存友好

  由于顺序表在内存中是连续存储的,访问元素时具有良好的局部性,能够充分利用CPU缓存机制,提高访问速度。这一点在处理大量数据时尤为重要。

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

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

相关文章

Vue3 vs Vue2:全面对比与面试宝典

文章目录Vue3 vs Vue2&#xff1a;全面对比与面试宝典引言&#xff1a;Vue框架的进化之路一、核心架构对比二、响应式系统的革命Vue2的响应式&#xff1a;像老式监控摄像头Vue3的响应式&#xff1a;像智能AI监控系统三、API风格的进化Vue2的Options API&#xff1a;像填表格Vue…

Java Web开发:Session与Cookie详细入门指南

在Web开发中&#xff0c;状态管理是核心需求之一。本文将深入讲解Java中Session和Cookie的使用方法&#xff0c;帮助你掌握用户状态管理的核心技术。 一、Session与Cookie基础概念 特性SessionCookie存储位置服务器内存/持久化存储客户端浏览器安全性较高&#xff08;敏感数据…

HTTPS与CA证书:安全通信全解析

CA&#xff08;Certificate Authority&#xff09;&#xff1a;证书颁发机构&#xff0c;负责签发和管理数字证书&#xff0c;验证证书持有者的身份。HTTPS&#xff1a;基于 SSL/TLS 协议的 HTTP&#xff0c;通过证书实现客户端与服务器的身份验证和数据加密。HTTPSHTTPSSL/TLS…

AI生成代码时代的商业模式重构:从“软件即产品”到“价值即服务”

2025年,全球AI代码生成市场规模突破63亿元(数据来源:《中国AI代码生成行业发展报告》),开发者效率提升40%以上,软件开发成本下降30%。这一技术浪潮正在颠覆传统软件行业的商业逻辑——当代码生成变得像文字编辑一样简单时,企业如何构建可持续的商业模式? 本文将从硬件…

C#特性与反射知识梳理

C#中的**特性&#xff08;Attributes&#xff09;和反射&#xff08;Reflection&#xff09;**是两个非常重要的概念&#xff0c;它们通常用于代码的元编程&#xff0c;允许你在运行时获取类型信息并对其进行操作。下面对这两个概念进行详细梳理&#xff1a;一、C#中的特性&…

SQL 语法详解

SQL 语法详解 引言 SQL&#xff08;Structured Query Language&#xff09;是一种用于数据库管理的标准语言&#xff0c;它允许用户进行数据的查询、更新、插入和删除等操作。SQL语法是数据库管理和编程的基础&#xff0c;本篇文章将详细介绍SQL的基本语法和常用操作&#xff0…

为什么 sim(3) 中的尺度 s 与旋转 R 相乘,而不是平移 t?

文章目录为什么 sim(3) 中的尺度 s 与旋转 R 相乘&#xff0c;而不是平移 t&#xff1f;1️⃣ sim(3) vs SE(3)&#xff1a;结构对比与核心差异2️⃣ 为什么尺度 s 不乘在 t 上&#xff1f;&#x1f6ab; 数学破坏&#xff1a;&#x1f9ed; 几何解释&#xff1a;3️⃣ t 是“相…

如何为你的 Docker 容器设置代理网络

一文搞定!如何为你的 Docker 容器设置代理网络(及一个最常见的“坑”) 你是否遇到过这样的窘境:在你的服务器上,代理工具(比如 Clash, V2Ray)运行得好好的,浏览器也能科学上网,但一旦把应用放进 Docker 容器,它就瞬间“失联”,无法访问外部世界? 别担心,这是每个…

LeetCode Day3 -- 哈希表

目录 1. 啥是哈希表&#xff1f; 2. 啥时候用哈希表&#xff1f; 2.1 存在性检查 → 集合Set 2.2 键值映射 → 字典Dict 2.3 频率统计 → Dict or Counter 3. LeetCode 3.1 集合 &#xff08;1&#xff09;2215 找出两数组的不同 &#xff08;2&#xff09;1207 独一无…

三子棋装置(电赛24E题)K230/STM32全开源

三子棋装置&#xff08;电赛24E题&#xff09;K230/STM32全开源&#xff0c;后续有具体代码参数讲解&#xff0c;帮助大家移植k230代码import time, os, sysfrom media.sensor import * from media.display import * from media.media import *from machine import UART from m…

终端安全检测与防御

1. 终端安全风险主要问题&#xff1a;企业网络中80%的安全事件源于终端&#xff0c;终端成为黑客攻击的重要目标。攻击手段&#xff1a;勒索病毒&#xff1a;直接勒索用户。横向渗透&#xff1a;通过受控终端攻击内部服务器。僵尸网络危害&#xff1a;信息窃取、钓鱼网站引导、…

Video_AVI_Packet(2)

博主声明&#xff1a;内容来自网络&#xff0c;仅供参考&#xff0c;仅适用于浅了解&#xff0c;如有错误&#xff0c;自行甄别&#xff0c;由此引起的后果概不负责 Video_AVI_Packet&#xff08;2&#xff09;一、Video Picture Aspect Ratio 与 Active Format Aspect Ratio1.…

八月补丁星期二:微软修复 111 个漏洞

微软将在2025 年 8 月补丁星期二修复 111 个漏洞&#xff0c;这一数量与近期平均水平大致相同。 与上个月的情况类似&#xff0c;微软知道今天发布的漏洞中只有一个已被公开披露&#xff0c;但声称没有证据表明存在野外利用。同样&#xff0c;截至发布时&#xff0c;唯一的补丁…

《C++进阶之继承多态》【普通类/模板类的继承 + 父类子类的转换 + 继承的作用域 + 子类的默认成员函数】

【普通类/模板类的继承 父类&子类的转换 继承的作用域 子类的默认构造函数】目录前言&#xff1a;------------------------一、继承的定义和使用1. 什么使继承&#xff1f;2. 为什么要引入继承&#xff1f;3. 怎么使用继承&#xff1f;① 父类&#xff08;基类&#xf…

Ubuntu22.04安装OBS Studio

OBS官网的最新的虽然支持Ubuntu系统&#xff0c;但是只支持最新的24.2版本的&#xff0c;而我的电脑上的Ubuntu的版本是22.04&#xff0c;所以在网上寻求解决办法&#xff0c;看到了这一片博客&#xff0c;作为参考来实现ubuntu22.04安装OBS&#xff0c;这里提示一下&#xff0…

Ansible 基本使用

Ansible 清单 静态主机清单 主机清单支持多种格式&#xff0c;例如ini、yaml、脚本等。 本次课程使用 ini 格式。 #创建主机清单[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4​#测试连接单个服务器[lykcontroller ~ 14:08:18]$ ansibl…

网络资源模板--基于Android Studio 实现的九寨沟App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情&#xff08;部分) 首页 购票页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也…

系统架构设计师备考之架构设计实践知识

1.信息系统架构设计理论与实践1.1.基本概念信息系统架构定义目前关于信息系统架构较为权威的定义有&#xff1a; &#xff08;1&#xff09;信息系统架构是系统的结构&#xff0c;由软件元素、元素外部可见属性和元素间关系组成。 &#xff08;2&#xff09;信息系统架构是软件…

【IgH EtherCAT】如何利用 RTAI 提供的实时任务和调度机制来构建一个高精度、确定性的工业控制应用

SVG图展示了系统的分层架构&#xff1a;RTAI实时层&#xff1a;包含RT_TASK、信号量和定时器EtherCAT Master层&#xff1a;主站、域、从站配置和PDO映射EtherCAT网络层&#xff1a;与实际硬件设备&#xff08;EL3162模拟输入、EL2004数字输出&#xff09;通信关键特点&#xf…

7款热门智能电视文件管理器横向评测

7款智能电视文件管理器横向评测 在智能电视和电视盒子日益普及的今天&#xff0c;一款好用的文件管理器能让您的数字生活更加便捷。本文为您评测了7款广受欢迎的TV版文件管理器&#xff0c;助您找到最适合自己的工具。 1. ES文件浏览器TV版 ES文件浏览器是一款广受欢迎的多功能…