【数据结构】动态顺序表详解

目录

1.顺序表的概念及结构

2.动态顺序表的实现

2.1创建新项目

2.2动态顺序表的创建

2.3接口的实现及测其功能

2.3.1初始化

2.3.2尾插

2.3.3头插

2.3.4尾删&头删

2.3.5打印&从任意位置插入

2.3.6删除任意位置的数据

2.3.7查找

2.3.8销毁顺序表

3.结语


Hello everybody!今天打算跟大家聊聊动态顺序表。顺序表是最基础的数据结构,也是最实用的数据结构。在今后学习栈和队列时,会基于顺序表去实现它们。动态顺序表顾名思义,就是容量可变的顺序表。我们可以随意在该顺序表中插入数值,并且会自动扩容,十分具有实际应用的价值。那废话不多说,让我们开始叭!

1.顺序表的概念及结构

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

顺序表一般可以分为:

1.静态顺序表:使用定长数组存储元素

2.动态顺序表:使用动态开辟的数组存储

由于静态顺序表实用价值极低,实现思路上不如动态顺序表,且会实现动态顺序表的话实现静态顺序表也没有太大的问题。因此在这里只给大家详细讲解一下动态顺序表的实现!

2.动态顺序表的实现

2.1创建新项目

进入数据结构,我们要写的代码量会有十分明显的增加。例如今天的动态顺序表,代码量将会轻轻松松突破100行。所以我建议创建三个文件。这样便于理清代码逻辑以及后期代码的维护。我在上一篇文章和上上篇文章中有更详细的介绍,如果有疑问可以参考栈详解或队列详解。

2.2动态顺序表的创建

首先我们要把需要用到的头文件包含进来,下面的结构体就是咱们的顺序表。其中各个变量的作用我已经注释出来。结构体的下面是顺序表的各种接口。

2.3接口的实现及测其功能

2.3.1初始化

首先我们来解释一下为什么要传结构体指针而不是结构体:要知道,函数传参是对实际参数的拷贝。如果传结构体的话,在函数体内部的一切操作都不会对函数外部的结构体有任何改变,所以我们需要传指针。

这里将顺序表的各个变量给一个起始值就算是完成初始化了。

2.3.2尾插

这两个接口实现完成后我们来看看它们的功能如何:

在测试功能中,我们首先初始化,然后依次尾插了1,2,3,4,5,五个数据。该动态顺序表应该会扩容两次,因此容积是8,有效数据有5个,size为5。测试结果符合预期,这两个接口功能正常。

2.3.3头插

由于头插依然会涉及到顺序表容量不够用从而自动扩容的情况,那么这个接口会有相当一部分代码和尾插一模一样。考虑到代码的简洁性,我们把自动扩容功能单独拎出来形成一个函数:

有了这个函数,头插和尾插直接调用它就ok了!

在头插中,我们需要移动数据。在while循环中把所有的数据向后移动一位,再把要插入的数据把顺序表中的第一个数据覆盖掉。移动数据的时间复杂度是O(n),效率不高。由此可见顺序表并不适合头插。同样的,也不适合头删。

测试功能正常。

2.3.4尾删&头删

尾删和头删的逻辑就比较简单了。但是要特别说明一下,尾删和头删并不是正在意义上的和数据删除了,对于尾删,只需把size减小一个就可以了,以后插入数据的话自然会把原数据覆盖掉。头删就是用后面的数据向前覆盖,也是同样的道理。

2.3.5打印&从任意位置插入

如果上面的接口搞懂了的话,这两个接口就没什么难度啦!

2.3.6删除任意位置的数据

2.3.7查找

2.3.8销毁顺序表

3.结语

好啦,关于动态顺序表的讨论就到这里喽。看完这篇文章依然没有搞懂的宝子可以把自己的疑惑发在评论区呦!

顺序表是数据结构的基础,大家一定要熟悉它!

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

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

相关文章

2018-2022年富时罗素 ESG评分数据

2018-2022年富时罗素 ESG评分数据 1、时间:2018-2022年 2、指标:证券代码、证券简称、富时罗素ESG评分、 3、说明: 富时罗素ESG评级体系评估了中国大陆、香港、欧洲以及美国等市场上1800家中国上市企业股票,评估了7200多种证券…

scss的高级用法——循环

周末愉快呀!一起来学一点简单但非常有用的css小知识。 最近在一个项目中看到以下css class写法: 了解过tailwind css或者unocss的都知道,从命名就可以看出有以下样式: font-size: 30pxmargin-left: 5px;margin-top: 10px; 于是…

SpringBoot监听器解析

监听器模式介绍 监听器模式的要素 事件监听器广播器触发机制 SpringBoot监听器实现 系统事件 事件发送顺序 监听器注册 监听器注册和初始化器注册流程类似 监听器触发机制 获取监听器列表核心流程: 通用触发条件: 自定义监听器实现 实现方式1 实现监听器接口: Order(1) …

Docker Volume: 实现容器间数据共享与持久化的利器

文章目录 Docker Volume的作用Docker Volume与容器内数据的比较优势劣势 Docker Volume的创建和管理创建Docker Volume管理Docker Volume 演示Docker Volume的挂载Docker Volume的生命周期安全性考虑与Docker Volume应用场景Docker Volume与多容器协作容器迁移与Docker Volume未…

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用,已经成为全球范围内数以亿计的用户的首选。而在普及的同时,短视频领域也在不断拓展自身的业务领域,其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务,用…

用css实现原生form中radio单选框和input输入框的hover样式以及聚焦focus的样式

一.问题描述:用css实现原生form中radio单选框和input的hover已经focus的样式 在实际的开发中,一般公司ui都会给效果图,比如单选按钮radio样式,input输入框hover的时候样式,以及focus的时候样式,等等&#…

【并发编程】ThreadLocal详解与原理

📫作者简介:小明Java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

java项目之社区互助平台(ssm+vue)

项目简介 社区互助平台实现了以下功能: 1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果有中意的社区互助信息时,要登录注册,只有注册成功才有的权限。2、管理员的功能及权限 用户信息的添…

[C/C++] 数据结构 LeetCode:用队列实现栈

题目描述: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元…

图像分割方法

常见的图像分割方法有以下几种: 1.基于阈值的分割方法 灰度阈值分割法是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。阈值分割方法实际上是输入图像f到输出图像g的如下变换: 其中,T为阈值;对于物体的…

如何用cmd命令快速搭建FTP服务

环境: Win10专业版 问题描述: 如何用cmd命令快速搭建FTP服务 解决方案: 1.输入以下命令来安装IIS(Internet Information Services): dism /online /enable-feature /featurename:IIS-FTPServer /all …

如果文件已经存在与git本地库中,配置gitignore能否将其从git库中删除

想把项目的前后台代码放到同一个git仓库管理,由于未设置.gitignore,就使用vscode做stage操作(相当于git add . 命令 其中【.】点表示全部文件),观察将要入库的文件发现,node_modules、target、.idea、log等…

webpack项目 index.html 根据不同的变量引入不同的js

项目 webpack搭建 问题:在入口文件index.html中根据不同的变量引入不同的js 使用插件HtmlWebpackPlugin HtmlWebpackPlugin 项目里用来生成静态文件的 这个插件每个项目基本都要用到的,只要全局搜一下位置 根据配置文件的指令找到执行的文件&#xff0…

达索系统SOLIDWORKS流体分析网格划分失败,大多是这2种原因

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件,该软件功能强大、操作人性化,快速轻松的分析产品内部或外部流体的流动情况,以用来改善产品性能和功能。 当流体分析运行网格划分时,提示失败。 这是由于凸起面与圆…

C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库四.其他 一.前言 这篇文章简单讨论一下VS如何生成和使用C静态链接库,示例使用VS2022环境。 二.生成静态链接库 先创建C项目-静态库 然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。 然…

2023 年最新 MySQL 数据库 Windows 本地安装、Centos 服务器安装详细教程

MySQL 基本概述 MySQL是一个流行的关系型数据库管理系统(RDBMS),广泛应用于各种业务场景。它是由瑞典MySQL AB公司开发,后来被Sun Microsystems收购,最终被甲骨文公司(Oracle Corporation)收购…

独立版求职招聘平台小程序开发

小程序招聘系统开发 我们开发了一款高效、便捷的互联网招聘平台。在这里,可以轻松实现企业入驻、职位发布、在线求职、精准匹配职位和人才,以及参与招聘会等功能。目标是为求职者和企业搭建一个连接彼此的桥梁,帮助您更快地找到满意的工作&…

数据结构与算法编程题11

已知两个链表A和B分别表示两个集合&#xff0c;其元素递增排列。 请设计算法求出A与B的交集&#xff0c;并存放于A链表中。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #defin…

竞赛选题 身份证识别系统 - 图像识别 深度学习

文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计 图像识别 深度学习 身份证识别…

第二十章:多线程

进程 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//继承重…