当前位置: 首页 > news >正文

初级数据结构——顺序表

目录

  • 前言
  • 一、定义与特点
  • 二、类型
  • 三、基本操作
  • 四、应用场景
  • 五、优缺点
  • 六、元素插入和删除动态图解
    • 插入
    • 删除
  • 七、代码模板
  • 八、使用顺序表的经典例题
    • 1.求奇数的乘积
      • 代码题解
    • 2.数值统计
      • 代码题解
  • 九、总结
  • 结语

前言

顺序表示最基础的数据结构之一,它也是我们学习开始学习数据结构的第一个必须要掌握的数据结构,学习数据结构一定是由浅到深,所以我们最好是先学习简单的在学习有难度的,因为直接学习难的数据结构很容易劝退,让我们来深入了解顺序表。
在这里插入图片描述

一、定义与特点

定义:顺序表(Sequence List)是线性表的一种实现方式,它使用一段地址连续的存储单元依次存储线性表的数据元素。

特点
1.数据元素在物理存储上是连续的,这使得顺序表在访问元素时具有较高的效率。
2.顺序表支持随机访问,即可以通过索引直接访问表中的任意元素,时间复杂度为O(1)。
3.顺序表的插入和删除操作可能需要移动大量的元素,尤其是在插入或删除中间位置的元素时,时间复杂度为O(N),其中N是表中元素的数量。

二、类型

静态顺序表:静态顺序表在初始化后,其空间大小就不能更改。这意味着如果空间不足,就无法向表中添加新的元素;而如果空间过大,则可能造成内存的浪费。因此,静态顺序表在实际应用中具有一定的局限性。

动态顺序表:动态顺序表则可以根据需要动态地调整空间大小。当空间不足时,可以自动扩容;当空间过多时,也可以进行缩容(尽管在实际应用中缩容并不常见)。这使得动态顺序表在实际应用中更加灵活和高效

三、基本操作

初始化:为顺序表分配必要的存储空间,并初始化相关参数(如有效数据个数、容量等)。

销毁:释放顺序表所占用的存储空间,以避免内存泄漏。
插入:在顺序表的指定位置插入一个新的元素。这可能需要移动其他元素来腾出位置。

删除:从顺序表中删除指定位置的元素。这同样可能需要移动其他元素来填补位置。

查找:在顺序表中查找指定值的元素,并返回其位置(如果存在)。这通常通过遍历数组来实现。

访问:通过索引直接访问顺序表中的指定元素。这是顺序表的一个主要优点。

四、应用场景

顺序表适用于需要频繁访问元素的场景,因为顺序表支持随机访问,可以在常数时间内访问到表中的任意元素。此外,顺序表也适用于元素个数相对稳定的场景,因为频繁的插入和删除操作可能会导致顺序表的效率下降。

五、优缺点

优点
支持随机访问,访问速度快。
在物理存储上是连续的,有利于CPU高速缓存的命中率。

缺点
插入和删除操作可能需要移动大量的元素,效率较低。
在空间不足时需要扩容,扩容操作可能比较耗时且浪费空间(尽管通常采用两倍扩容策略来减少扩容次数)。

六、元素插入和删除动态图解

插入

在这里插入图片描述

删除

在这里插入图片描述

七、代码模板

#include<iostream>
using namespace std;#define eType intstruct SequentialTable {eType* elements;int size;int capacity;
};void initailizeTable(SequentialTable* list, int capacity) {//1.初始化顺序表list->elements = new eType[capacity];//elements申请内存为eType类型的内存空间,相当于数组容量为capacitylist->capacity = capacity;list->size = 0;}void destroyTable(SequentialTable* list) {//销毁顺序表delete[] list->elements;//将elements内存空间销毁
}int getSize(SequentialTable* list) {//顺序表长度return list->size;
}bool isEmpty(SequentialTable* list) {//顺序表是否为空return list->size == 0;
}void insertElement(SequentialTable* list,int index, eType x) {//插入元素 ,index为插入位置,x为插入的元素if (index<0 || index>list->size) {throw std::invalid_argument("Invalid index");//插入位置非法那么抛出异常}if (list->size == list->capacity) {//如果顺序表长度大于容量那就扩容int newCapacity = 2 * list->capacity;//容量扩大为原来的两倍eType* newElements = new eType[newCapacity];for (int i = 0; i < list->size; i++) {newElements[i] = list->elements[i];}delete[] list->elements;//释放原来内存空间list->elements = newElements;list->capacity = newCapacity;}for (int i = list->size; i > index; i--) {list->elements[i] = list->elements[i - 1];}list->elements[index] = x;list->size++;//注意插入元素,长度加一
}void deleteElement(SequentialTable* list, int index) {if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}if (list->size == 0) {//如果顺序表没有元素那么进行不了删除操作,抛出异常throw std::invalid_argument("Invalid index");}for (int i = index; i < list->size - 1; i++) {list->elements[i] = list->elements[i + 1];}list->size--;//长度减一
}int findElement(SequentialTable* list, eType x) {//找出元素的索引for (int i = 0; i < list->size; i++) {if (x == list->elements[i])return i;}return -1;//找不到返回-1
}eType getElement(SequentialTable* list, int index) {//返回索引对应的元素if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}return list->elements[index];
}void updateElement(SequentialTable* list, int index, eType x) {//更新元素if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}list->elements[index] = x;
}int main() {//测试代码SequentialTable st;initailizeTable(&st, 10);for (int i = 0; i < 10; i++) {insertElement(&st, i, i * 10);}deleteElement(&st, 0);cout << st.elements[0] << endl;insertElement(&st, 0, 0);cout << st.elements[0] << endl;cout << isEmpty(&st) << endl;cout << findElement(&st, 70) << endl;cout << getElement(&st, 7) << endl;updateElement(&st, 0, 1);cout << st.elements[0] << endl;return 0;
}

八、使用顺序表的经典例题

1.求奇数的乘积

(帅哥们这个蓝色字体可以点进去看原题)

代码题解

#include<iostream>
using namespace std;#define eType intstruct SequentialTable {eType* elements;int size;int capacity;
};void initailizeTable(SequentialTable* list, int capacity) {//1.初始化顺序表list->elements = new eType[capacity];//elements申请内存为eType类型的内存空间,相当于数组容量为capacitylist->capacity = capacity;list->size = 0;}void destroyTable(SequentialTable* list) {//销毁顺序表delete[] list->elements;//将elements内存空间销毁
}int getSize(SequentialTable* list) {//顺序表长度return list->size;
}bool isEmpty(SequentialTable* list) {//顺序表是否为空return list->size == 0;
}void insertElement(SequentialTable* list,int index, eType x) {//插入元素 ,index为插入位置,x为插入的元素if (index<0 || index>list->size) {throw std::invalid_argument("Invalid index");//插入位置非法那么抛出异常}if (list->size == list->capacity) {//如果顺序表长度大于容量那就扩容int newCapacity = 2 * list->capacity;//容量扩大为原来的两倍eType* newElements = new eType[newCapacity];for (int i = 0; i < list->size; i++) {newElements[i] = list->elements[i];}delete[] list->elements;//释放原来内存空间list->elements = newElements;list->capacity = newCapacity;}for (int i = list->size; i > index; i--) {list->elements[i] = list->elements[i - 1];}list->elements[index] = x;list->size++;//注意插入元素,长度加一
}void deleteElement(SequentialTable* list, int index) {if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}if (list->size == 0) {//如果顺序表没有元素那么进行不了删除操作,抛出异常throw std::invalid_argument("Invalid index");}for (int i = index; i < list->size - 1; i++) {list->elements[i] = list->elements[i + 1];}list->size--;//长度减一
}int findElement(SequentialTable* list, eType x) {//找出元素的索引for (int i = 0; i < list->size; i++) {if (x == list->elements[i])return i;}return -1;//找不到返回-1
}eType getElement(SequentialTable* list, int index) {//返回索引对应的元素if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}return list->elements[index];
}void updateElement(SequentialTable* list, int index, eType x) {//更新元素if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}list->elements[index] = x;
}int main() {//测试代码int n;while (cin >> n) {SequentialTable s;initailizeTable(&s, 1);for (int i = 0; i < n; i++) {int x;cin >> x;insertElement(&s, i, x);}int ret = 1;for (int i = 0; i < s.size; i++) {int val = getElement(&s, i);if (val & 1)ret *= val;}cout << ret << endl;}return 0;
}

2.数值统计

(帅哥们这个蓝色字体可以点进去看原题)

代码题解

#include<iostream>
using namespace std;#define eType double//元素类型struct SequentialTable {eType* elements;int size;int capacity;
};void initailizeTable(SequentialTable* list, int capacity) {//1.初始化顺序表list->elements = new eType[capacity];//elements申请内存为eType类型的内存空间,相当于数组容量为capacitylist->capacity = capacity;list->size = 0;}void destroyTable(SequentialTable* list) {//销毁顺序表delete[] list->elements;//将elements内存空间销毁
}int getSize(SequentialTable* list) {//顺序表长度return list->size;
}bool isEmpty(SequentialTable* list) {//顺序表是否为空return list->size == 0;
}void insertElement(SequentialTable* list,int index, eType x) {//插入元素 ,index为插入位置,x为插入的元素if (index<0 || index>list->size) {throw std::invalid_argument("Invalid index");//插入位置非法那么抛出异常}if (list->size == list->capacity) {//如果顺序表长度大于容量那就扩容int newCapacity = 2 * list->capacity;//容量扩大为原来的两倍eType* newElements = new eType[newCapacity];for (int i = 0; i < list->size; i++) {newElements[i] = list->elements[i];}delete[] list->elements;//释放原来内存空间list->elements = newElements;list->capacity = newCapacity;}for (int i = list->size; i > index; i--) {list->elements[i] = list->elements[i - 1];}list->elements[index] = x;list->size++;//注意插入元素,长度加一
}void deleteElement(SequentialTable* list, int index) {if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}if (list->size == 0) {//如果顺序表没有元素那么进行不了删除操作,抛出异常throw std::invalid_argument("Invalid index");}for (int i = index; i < list->size - 1; i++) {list->elements[i] = list->elements[i + 1];}list->size--;//长度减一
}int findElement(SequentialTable* list, eType x) {//找出元素的索引for (int i = 0; i < list->size; i++) {if (x == list->elements[i])return i;}return -1;//找不到返回-1
}eType getElement(SequentialTable* list, int index) {//返回索引对应的元素if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}return list->elements[index];
}void updateElement(SequentialTable* list, int index, eType x) {//更新元素if (index < 0 || index >= list->size) {throw std::invalid_argument("Invalid index");}list->elements[index] = x;
}int main() {//测试代码int n;while (cin >> n&&n) {SequentialTable s;initailizeTable(&s, 1);for (int i = 0; i < n; i++) {eType x;cin >> x;insertElement(&s, i, x);}int pcnt = 0, zcont = 0, ncnt = 0;for (int i = 0; i < s.size; i++) {eType val = getElement(&s, i);if (val > 1e-8) pcnt++;else if (val < -1e-8) ncnt++;else zcont++;}cout << ncnt << " " << zcont << " " << pcnt << endl;}return 0;
}

九、总结

综上所述,顺序表是一种基于数组实现的线性数据结构,具有随机访问速度快、物理存储连续等优点。然而,它也存在插入和删除操作效率低、扩容操作耗时等缺点。因此,在选择数据结构时,需要根据具体的应用场景和需求来权衡利弊。

结语

学习编程是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,不会的地方就问,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油,我相信你一定能行。
在这里插入图片描述
想看更多内容可以关注我,看我作品,关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家。
在这里插入图片描述

相关文章:

初级数据结构——顺序表

目录 前言一、定义与特点二、类型三、基本操作四、应用场景五、优缺点六、元素插入和删除动态图解插入删除 七、代码模板八、使用顺序表的经典例题1.求奇数的乘积代码题解 2.数值统计代码题解 九、总结结语 前言 顺序表示最基础的数据结构之一&#xff0c;它也是我们学习开始学…...

游戏引擎学习第五天

这节貌似没讲什么 视频参考:https://www.bilibili.com/video/BV1Gmm2Y5EwE/ uint8 *A somewhere in memory; uint8 *B somewhere in memory;//BEFORE WE GOT TO HERE int Y *B; // whatever was actually there before the 5 *A 5; int X *B; // 5 //Obviously! Y and …...

智能社区服务小程序+ssm

智能社区服务小程序 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了智能社区服务小程序的开发全过程。通过分析智能社区服务小程序管理的不足&#xff0c;创建了一个计算机管理智能社区服务小程序的方案。文…...

glide性能优化实战

glide性能优化实战 前言 项目使用glide加载图片之前也只是会基本api,这次项目有非常多的图片需要展示&#xff0c;而且设备是一个android12的版本&#xff0c;但是性能不太理想&#xff0c;分给APP的资源不太多&#xff0c;所以需要优化现有图片加载逻辑&#xff0c;读者可以…...

Python 环境搭建和安装(保姆级教程)

本章节我们将向大家介绍如何在本地搭建Python开发环境。 Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等…...

Java并发编程(二):同步机制与多线程是否矛盾

同步机制与多线程是否矛盾 0 纠正对异步和多选误解1 概述2 为什么要引入同步机制3 为什么多线程依然有意义3 总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 0 纠正对异步和多选误解 行文之前先纠正一下…...

golang分布式缓存项目 Day2 单机并发缓存

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 支持并发读写 接下来我们使用 sync.Mutex 封装 LRU 的几个方法&#xff0c;使之支持并发的读写。在这之…...

一个百度、必应搜索引擎图片获取下载的工具包

前言&#xff1a;前段时间需要一大批图片&#xff0c;跑去百度搜图下载&#xff0c;发现特别麻烦&#xff0c;于是用了一天时间写了一个工具库&#xff0c;方便后续使用&#xff0c;这里分享给大家 imagecapture 是一个用 Go 语言编写的库&#xff0c;旨在从百度和必应等搜索引…...

安全见闻(网络安全篇)

笔记仅供学习&#xff0c;切勿触碰法律红线&#xff01; 以下笔记学习来自B站泷羽Sec&#xff1a;https://space.bilibili.com/350329294?spm_id_from333.337.search-card.all.click 如涉及侵权马上删除文章 1.编程语言 C语言&#xff1a;一种通用的、面向过程的编程语言&am…...

手写一些方法

模拟new方法 function Otaku(name,age) {this.name name;this.age age; this.habit Games}Otaku.prototype.strength 60;Otaku.prototype.sayName function () {console.log("I am " this.name);};function myNew(fn, ...args) {const obj Object.create(f…...

仅需三步!用AI工具免费打造10w+抖音爆款烟火秀视频教程

抖音上的烟火秀视频总能唤起人们对节日的温馨回忆&#xff0c;它们不仅视觉效果震撼&#xff0c;还自带流量属性。我自己在刷到这类视频时&#xff0c;也不禁回想起童年放烟花的快乐时光&#xff0c;那种浓厚的年味让人怀念。这些视频通常伴随着合适的音乐&#xff0c;能够迅速…...

基于redis实现API接口访问次数限制

一&#xff0c;概述 日常开发中会有一个常见的需求&#xff0c;需要限制接口在单位时间内的访问次数&#xff0c;比如说某个免费的接口限制单个IP一分钟内只能访问5次。该怎么实现呢&#xff0c;通常大家都会想到用redis&#xff0c;确实通过redis可以实现这个功能&#xff0c…...

[ Linux 命令基础 3 ] Linux 命令详解-文件和目录管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

npm i 的时候报错: npm ERR! Error: EPERM: operation not permitted, rename

文章目录 噩梦解决办法总结 噩梦 最近改漏洞&#xff0c;这个项目删掉了 node_modules文件夹 重新安装依赖&#xff0c;结果安装一半的时候就一直报这个错。 然后查了很多方法&#xff0c;基本都是下面这些&#xff1a; 权限不够&#xff0c;以管理员运行cmd重新安装。清除 n…...

如何迁移剪映源文件

1、打开剪映&#xff0c;打开全局设置 2、查看草稿位置。把要迁移的文件拷贝到这个路径下面。 3、关闭文件&#xff0c;返回上一层界面&#xff0c;可以看到拷贝到目录下的文件。...

Go语言中的`io.Copy`函数:高效的数据复制解决方案

在Go语言中&#xff0c;io.Copy函数是一个强大而高效的工具&#xff0c;用于将数据从一个io.Reader复制到一个io.Writer。这篇文章将深入探讨io.Copy函数的工作原理、使用方法及其在实际应用中的优势。无论您是后端开发人员还是对Go语言感兴趣的程序员&#xff0c;这篇文章都将…...

datastage在升级版本到11.7之后,部分在11.3上正常执行的SP报错SQLSTATE = 22007: 本机错误代码 = -180

在升级版本到11.7之后&#xff0c;部分在11.3上正常执行的SP开始报错&#xff0c;报的SQL错误是时间参数问题&#xff0c;但是一样的SP可以直接call sp执行&#xff0c;也可以手动调用作业执行&#xff0c;只有设置定时调度时作业会报错&#xff0c; CALLXXX.XXX(1,CURRENT TIM…...

docker——项目部署

什么是Docker&#xff1f; Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。容器完全使用沙盒机制&#xff0c;相互之间不会存在任何接口。几…...

设计模式(Unity)——更新中

设计模式 文章目录 设计模式工厂模式创建方法&#xff08;Create Methods&#xff09;简单工厂&#xff08;Simple Factory&#xff09;工厂方法&#xff08;Method Factory&#xff09;抽象工厂&#xff08;Abstract Factroy&#xff09; 策略模式 工厂模式 创建方法&#xf…...

小程序中引入下载到本地的iconfont字体图标加载不出来问题解决

我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …...

告别卡顿!深度解析麒麟V10桌面版mate-indicators与auditd内存飙升的关联与根治

麒麟V10桌面版性能优化实战&#xff1a;解决mate-indicators与auditd内存异常问题最近有不少麒麟V10桌面版用户反馈系统运行一段时间后变得异常卡顿&#xff0c;打开系统监视器查看&#xff0c;发现mate-indicators或auditd进程的内存占用居高不下&#xff0c;有时甚至达到几个…...

跨VM RowHammer攻击防御技术与DRAM安全研究

1. 跨VM RowHammer攻击与防御技术概述在云计算环境中&#xff0c;虚拟机(VM)之间的安全隔离是保障多租户数据安全的核心机制。然而&#xff0c;RowHammer攻击的出现对这一基础安全假设提出了严峻挑战。RowHammer是一种利用DRAM物理特性的硬件漏洞攻击方式&#xff0c;攻击者通过…...

不止于播放:用Unity Video Player的RenderTexture模式,轻松实现游戏内电视、监控屏效果

超越基础播放&#xff1a;用Unity VideoPlayer打造沉浸式动态屏幕效果在游戏开发中&#xff0c;环境细节往往是区分平庸与卓越作品的关键。想象一下&#xff1a;玩家走进一个废弃的安全屋&#xff0c;墙上的监控屏幕闪烁着模糊的画面&#xff1b;或是科幻基地中&#xff0c;数据…...

深入理解RAG中的嵌入模型Embedding Model

前言在当前流行的RAG引擎&#xff08;例如RAGFlow、Qanything、Dify、FastGPT等&#xff09;中&#xff0c;嵌入模型&#xff08;Embedding Model&#xff09;是必不可少的关键组件。在RAG引擎中究竟扮演着怎样的角色呢&#xff1f;本文笔者进行了总结&#xff0c;与大家分享~什…...

如何让孩子从零开始学习Python编程?BBC micro:bit实战指南

如何让孩子从零开始学习Python编程&#xff1f;BBC micro:bit实战指南 【免费下载链接】Python-For-Kids A FREE comprehensive online Python development tutorial FOR KIDS utilizing an official BBC micro:bit Development Board going step-by-step into the world of Py…...

Magic VLSI:开启你的芯片设计之旅,从零到一轻松掌握

Magic VLSI&#xff1a;开启你的芯片设计之旅&#xff0c;从零到一轻松掌握 【免费下载链接】magic Magic VLSI Layout Tool 项目地址: https://gitcode.com/gh_mirrors/magi/magic 你是否曾梦想亲手设计自己的芯片&#xff1f;是否对集成电路设计充满好奇却不知从何入手…...

艾多美非传销远离“一夜暴富”,拥抱“细水长流”

在商业模式的讨论中&#xff0c;艾多美常被误读为传销&#xff0c;这种误解源于对“成功路径”的不同想象。传销往往以“一夜暴富”的虚幻承诺吸引参与者&#xff0c;描绘出一条“拉人头、赚快钱”的捷径&#xff1b;而艾多美倡导的是截然不同的价值观——通过日复一日的产品使…...

掌握AI技能配置技巧 大幅提升日常办公开发效率

P.S. 目前国内还是很缺AI人才的&#xff0c;希望更多人能真正加入到AI行业&#xff0c;共同促进行业进步&#xff0c;增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow&#xff0c;教程通俗易懂&#xff0c;高中生都能…...

Pulumi基础设施即代码实战:用Python和TypeScript管理云资源

Pulumi基础设施即代码实战:用Python/TypeScript管理云资源 作者:Crown_22 | AI Agent & Hermes Agent 桌面程序开发者 前言 Terraform 是基础设施即代码(IaC)领域的霸主,但它使用 HCL(HashiCorp Configuration Language)这种领域专用语言,学习曲线陡峭,调试困难,…...

漏洞研究工作流:从CVE追踪到实战提升的闭环方法论

1. 这不是“资源列表”&#xff0c;而是一套可落地的漏洞研究工作流很多人一看到“在线资源全攻略”就下意识点开收藏&#xff0c;然后扔进浏览器书签夹吃灰。我见过太多安全从业者——包括刚入行的蓝队新人、想补实战短板的渗透测试员、甚至部分做红队支撑的工程师——把CVE编…...