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

数据结构之——(手撕)顺序表

本章会介绍的知识点如下图:

 

 1: 顺序表的概念:顺序表是用一段物理地址连续的存储单元依次存储数据的线性结构,通常我们使用数组来表示,对数组进行增删查改。

                 顺序表的结构:逻辑结构与物理结构都是内存中一块连续开辟的空间,都是11对应的线性结构。

2: 顺序表的两种定义方式:静态的顺序表与动态的顺序表,一般情况下我们很少会用静态的顺序表,因为静态的顺序表会将空间固定,导致如果我们使用顺序表的时候可能会浪费很多的空间,也可能在我们增容的时候会出现空间不够的情况,这种情况下如果我们还是在继续使用的话那么数组将会越界这种情况是error的。

两种定义顺序表的方式代码如下

        静态的顺序表        

typedef int SqListDataType;//这里是给我们的顺序表元素的类型起个名字
//							 假设元素是其他类型我们就可以修改这里
//静态的
struct SqList1
{SqListDataType arr1[1000];//开辟了一个整形的数组int size;//用来记录顺序表当前使用了多少的空间
};

动态的顺序表:

        

struct SqList2
{SqListDataType* arr2;int size;int Capacity;//用来记录当前数组开辟了多少个空间
};

在这两种结构中通常我们是会选择动态的顺序表来管理数据的。

3:顺序表的接口实现:

我们最终选择这个定义的顺序表 

        1:这个接口的定义是应为当我们在增加元素的时候我们所存储的元素会变多,总有一种情况下我们空间会慢,所以这时候我们就需要扩容,使用了realloc这个函数扩容有两种情况,一种是原地扩,一种是换个空间扩。不管怎么样我们都定义一个空间,用来存储新开辟的地址,让后在给ps

//检查容量的代码
void check_capacity(SqList* ps)
{assert(ps);//空间不够,扩容,一次扩两倍if (ps->Capacity == ps->size){SqListDataType* tmp=(SqListDataType*)realloc(ps->arr, (ps->Capacity)* 2*sizeof(SqListDataType));if (tmp == NULL){perror("realloc fail");exit(-1);}else{printf("扩容成功\n");ps->arr = tmp;ps->Capacity *= 2;}}}

2:头插思路:先检查空间是否足够,在从后往前移动元素,将第一个位置出来,最后在添加元素即可。

void PushFrontSqList(SqList* ps, SqListDataType x)
{//先检查空间够不够,空间不够扩容check_capacity(ps);//先判断空间是否满了//先移动元素int end = ps->size - 1;while (end >= 0){ps->arr[end + 1] = ps->arr[end];end--;}ps->arr[0] = x;ps->size++;
}

上述代码的意思如下图:

        

 3:尾插思路:这个挺简单的,我们只要在size位置插入即可,size在++即可,这里要注意的就是我们插入要以数组的下标。

代码:

void PushBackSqList(SqList* ps, SqListDataType x)
{assert(ps);check_capacity(ps);ps->arr[ps->size] = x;ps->size++;//SqListInsert(ps, ps->size, x);
}

 4:头删思路:我们首先得判断顺序表是否有元素,如果有的话才能进行删除,我们只需要遍历数组从前往后将后一个元素移动到前一个就行,这里需要注意的就是我们移动时位置的不同可能导致代码的不一样,而我的代码是从第一个开始所以我最后的位置因该是size-2处,然后size--就可以了。

代码:

void PopFrontSqList(SqList* ps)
{assert(ps);assert(ps->size > 0);int i = 0;for (i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

5:尾删思路:这个挺简单的,首先还是得判断顺序表是否存在元素,如果有将size--就行了。

代码:

void PopBackSqList(SqList* ps)
{assert(ps);assert(ps->size > 0);ps->size--;
}

6:顺序表得查找思路:遍历数组就行了,如果存在则返回下标,如果不存在我们返回-1.

代码:

int FindSqList(SqList* ps, SqListDataType x)
{assert(ps);//防止ps没有意义//思路:遍历顺序表找int i = 0;for (i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;}}//未找到printf("未找到\n");return -1;
}

7:顺序表插入思路:在pos位置处插入一个元素,pos为下标,首先先我们得判断pos是否存在,如果存在我们先从前往后将元素向后移动,然后在pos位置处插入即可。

代码:

void SqListInsert(SqList* ps, int pos, SqListDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);check_capacity(ps);int end = ps->size - 1;while (end >= pos){ps->arr[end + 1] = ps->arr[end];end--;}ps->arr[pos] = x;ps->size++;
}

图:

 8:顺序表的删除思路:先判断,pos是否在顺序表中,我们只要从前完后移动pos后面的元素即可,然后我们在把size--;

代码:

void SqListErase(SqList* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int i = pos;for (i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

9:顺序表的修改思路:先判断,pos是否在顺序表中,然后在根据数组随机访问的特点修改即可。

代码:

void ModifySqlist(SqList* ps, int pos, SqListDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->arr[pos] = x;}

10:打印:遍历数组即可

代码:

void SqListPrint(SqList* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

11:销毁顺序表这一步也不能省略,防止内存泄漏。

代码:

//销毁
void DestorySqList(SqList* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->Capacity = ps->size = 0;
}

以上就是顺序表的大致结构了。

通过上面我们可以发现:顺序表适合尾插,尾删,修改,这是因为顺序表随机访问的特点造成的。

        本章完,感谢大家的观看。

        

相关文章:

数据结构之——(手撕)顺序表

本章会介绍的知识点如下图&#xff1a; 1&#xff1a; 顺序表的概念&#xff1a;顺序表是用一段物理地址连续的存储单元依次存储数据的线性结构&#xff0c;通常我们使用数组来表示&#xff0c;对数组进行增删查改。 顺序表的结构&#xff1a;逻辑结构与物理结构都是内存中一块…...

冠达管理:非银金融是什么?

非银金融&#xff08;Non-banking Financial Institutions&#xff0c;简称非银&#xff09;是指除了传统的银行以外的其他金融机构。与银行不同的是&#xff0c;非银金融机构没有颁发钱银的权利&#xff0c;但在金融市场中发挥着重要的效果。在全球范围内&#xff0c;非银金融…...

go 结构体

定义结构体 package mainimport "fmt"type Person struct {age, id intname, email string }func main() {var p Personfmt.Printf("p: %v\n", p)p.age 100p.name "jaja"fmt.Printf("p.name: %v\n", p.name)// 匿名结构体var P…...

C++学习笔记---- 引用

1、作用 给变量起别名 基本语法&#xff1a;数据类型 &别名 原名 示例&#xff1a; #include <iostream> using namespace std;int main() {int a 1;int &b a;cout << "a " << a << endl;cout << "b " <…...

2023国赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…...

Cesium加载Supermap的wmts服务

最近使用cesium 加载supermap的wmts 服务&#xff0c;多次遇到加载异常与白页面问题&#xff0c;纠结好久最后才搞定[特此记录] 1、首先找到方法加载wmts 的api 文档 官方提示使用WebMapTileServiceImageryProvider加载wmts 2、然后编辑加载代码 //1.新建ImageryProviderlet…...

C/C++:C/C++在大数据时代的应用,以及C/C++程序员未来的发展路线

目录 1.C/C在大数据时代的应用 1.1&#xff1a;C/C数据处理 1.2&#xff1a;C/C数据库 1.3&#xff1a;C/C图像处理和计算机视觉 1.3.1&#xff1a;导读 2.C/C程序员未来的发展路线 2.1&#xff1a;图导 1.C/C在大数据时代的应用 C/C在大数据时代中仍然是一种被广泛应用的编…...

linux RabbitMQ-3.8.5 安装

软件版本操作系统CentOS Linux release 7.9.2009erlangerlang-23.0.2-1.el7.x86_64rabbitMQrabbitmq-server-3.8.5-1.el7 RabbitMQ的安装首先需要安装Erlang,因为它是基于Erlang的VM运行的。 RabbitMQ安装需要依赖:socat和logrotate&#xff0c;logrotate操作系统已经存在了&…...

单链表Single-LinkList

0、节点结构体定义 typedef struct LNode{int data;struct LNode *next;} Lnode, *LinkList; 1、初始化 bool InitList(LinkList &L) //初始化 {L new LNode;if(!L){return false;}L->next NULL;return true; } 2、创建 &#xff08;1&#xff09;头插法 void Cr…...

AI嵌入式全景:各厂商、系列和开发工具的综合概览

要看几个方面 1 算力&#xff1a; 2 支持何种模型&#xff1a; 3 是否支持可视化的窗口系统&#xff1a; 一般而言各个平台均采用linux操作系统&#xff0c;官方提供对应SDK&#xff0c;安装好后可使用硬件加速资源。 而且如果要使用其硬件加速&#xff0c;一般都要完成模型转…...

mysql Left Join on条件 where条件的用法区别

数据准备 SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.idt2.id; 执行结果 SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.idt2.id and t2.localbeijing; SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.idt2.id where t2.localbeijing…...

Redis中的淘汰策略

前言 本文主要说明在Redis面临key过期和内存不足的情况时&#xff0c;可以采用什么策略进行解决问题。 Redis中是如何应对过期数据的 正如我们知道的Redis是基于内存的、单线程的一个中间件&#xff0c;在面对过期数据的时候&#xff0c;Redis并不会去直接把它从内存中进行剔…...

MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射,让你在面试中脱颖而出!!

目录 一、引言 二、MyBatis动态SQL 2.1.if元素使用 2.2.foreach元素使用 三、MyBatis模糊查询 ①使用#{字段名} ②使用${字段名} ③使用concat{%,#{字段名},%} 总结 四、MyBatis结果映射 4.1.案例演示 4.1.1.resultType进行结果映射 4.1.2.resultMap进行结果映射 …...

C++ 写入txt文件内容并追加内容

咨询通义千问的“C 写入txt文件内容并追加内容”&#xff1a; 可以使用ofstream类来写入txt文件内容。若想追加内容&#xff0c;可以使用ios::app标志来创建输出流对象&#xff0c;然后在写入时将其设置为ios::app。以下是一个示例代码&#xff1a; #include <iostream>…...

Leetcode---359周赛

题目列表 2828. 判别首字母缩略词 2829. k-avoiding 数组的最小总和 2830. 销售利润最大化 2831. 找出最长等值子数组 一、判断首字母缩略词 纯模拟&#xff0c;代码如下 class Solution { public:bool isAcronym(vector<string>& words, string s) {string tmp…...

Keras三种主流模型构建方式:序列模型、函数模型、子类模型开发实践,以真实烟雾识别场景数据为例

Keras和PyTorch是两个常用的深度学习框架&#xff0c;它们都提供了用于构建和训练神经网络的高级API。 Keras: Keras是一个高级神经网络API&#xff0c;可以在多个底层深度学习框架上运行&#xff0c;如TensorFlow和CNTK。以下是Keras的特点和优点&#xff1a; 优点&#xf…...

objective-v 获取iPhone系统当前时间字符串适配12小时制和24小时制

我们最开始获取系统当前时间&#xff0c;如下&#xff0c;这种方式存在一个问题&#xff0c;当iPhone关闭了24小时制时&#xff0c;获取的时间格式是&#xff1a;iPhone11上&#xff1a;20230822下午210568760&#xff1b;iPhone7 plus上&#xff1a;2023082240043851 PM&#…...

并查集及其简单应用

文章目录 一.并查集二.并查集的实现三.并查集的基本应用 一.并查集 并查集的逻辑结构:由多颗不相连通的多叉树构成的森林(一个这样的多叉树就是森林的一个连通分量) 并查集的元素(树节点)用0~9的整数表示,并查集可以表示如下: 并查集的物理存储结构:并查集一般采用顺序结构实…...

基于web的服装商城系统java网上购物商店jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于web的服装商城系统 系统有1权限&#xff1a;前台…...

.NET Core发布到IIS

项目介绍 1、开发工具Visual Studio 2017&#xff0c;语言C#&#xff0c;SQL SERVER&#xff0c;WIN10 2、本地IIS&#xff0c;手机上或其他用户在和本地在同一个局域网内访问,同时要把防火墙关掉 3、IIS全名Internet Information Services&#xff0c;用来发布网站 先决条件 安…...

Spring的基本概念

前言 Spring 究竟是什么&#xff1f;其实Spring简单来说就是一个包含众多工具方法的IOC容器。 那么什么是IOC呢&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思. 既然Spring 是⼀个IoC&#xff08;控制反转&#xff09;容器&#xff0c;重点还在“容…...

设计模式之原型模式

文章目录 一、介绍二、实现步骤三、案例四、应用五、细胞分裂六、改造细胞分裂逻辑七、总结 一、介绍 原型模式属于创建型设计模式&#xff0c;用于创建重复的对象&#xff0c;且同时又保证了性能。 该设计模式的好处是将对象的创建与调用方分离。 其目的就是**根据一个对象…...

正则表达式在网页处理中的应用四则

正则表达式在网页处理中的应用四则 正则表达式(Regular Expression)为字符串模式匹配提供了一种高效、方便的方法。几乎所有高级语言都提供了对正则表达式的支持,或者提供了现成的代码库供调用。本文以ASP环境中常见的处理任务为例,介绍正则表达式的应用技巧。 一、检验密…...

ping使用方法

文章目录 1、Ping的基础知识2、Ping命令详解3、怎样使用Ping这命令来测试网络连通&#xff1f;4、如何用Ping命令来判断一条链路好坏&#xff1f;5、对Ping后返回信息的分析1.Request timed out2.Destination host Unreachable 1、Ping的基础知识 ping命令相信大家已经再熟悉不…...

“心理健康人工智能产学研创新联盟”揭牌成立|深兰科技

8月14日上午&#xff0c;“2023树洞救援年会”在上海举行&#xff0c;会上举行了“心理健康人工智能产学研创新联盟”的签约和揭牌仪式。“树洞行动救援团”创始人深兰科技科学院智能科学首席科学家、荷兰阿姆斯特丹自由大学人工智能系终身教授黄智生&#xff0c;深兰科技集团创…...

FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…...

Mybatis-动态sql和分页

目录 一.什么是Mybatis动态分页 二.mybatis中的动态SQL 在BookMaaper.xml中写sql BookMapper BookBiz接口类 BookBizImpl实现接口类 demo测试类 ​编辑 测试结果 三.mybatis中的模糊查询 mybatis中的#与$有是什么区别 在BookMapper.xml里面建立三个模糊查询 ​编辑 …...

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…...

数学建模及数据分析 || 4. 深度学习应用案例分享

PyTorch 深度学习全连接网络分类 文章目录 PyTorch 深度学习全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as…...

数据分析15——office中的Excel基础技术汇总

0、前言&#xff1a; 这部分总结就是总结每个基础技术的定义&#xff0c;在了解基础技术名称和定义后&#xff0c;方便对相关技术进行检索学习。笔记不会详细到所有操作都说明&#xff0c;但会把基础操作的名称及作用说明&#xff0c;可自行检索。本文对于大部分读者有以下作用…...

临沂建站公司/网站排名靠前的方法

你好&#xff01;首先&#xff0c;你说的Java窗口是指JFrame或者Frame其次&#xff0c;你说的窗口背景颜色是指直接调用JFrame或者Frame的setBackground(Color color)方法设置后显示出来的颜色。其实&#xff0c;你的想法是正确的&#xff0c;但是我想提醒你的是&#xff0c;你…...

货到付款 网站建设/seo网站关键词排名快速

简单的登录与注销 DAO实现用户名和密码 首先在数据库中创建表 t_user&#xff1a; 然后实现DAO&#xff1a; User.java&#xff1a; import lombok.Data;Data public class User {private Long id;private String username;private String password; }IUserDAO.java&#x…...

joomla 做 企业网站/深圳关键词优化平台

1.基础概念理解 首先&#xff0c;python里有包和模块&#xff0c;对应到我们熟知的windows系统里来&#xff0c;就是文件夹与py文件&#xff0c;也即python的包是一个文件夹&#xff0c;但这个文件夹下必须要有一个__init__.py的文件&#xff0c;而python的模块对应的是一个py文…...

网站建设设计书/大连seo按天付费

原文链接&#xff1a;http://docs.autofac.org/en/latest/lifetime/index.html Lifetime 是指服务的实例在程序中存活多久 – 从最初的实例化到清理&#xff08;disposal&#xff09;。例如&#xff0c;一个实现 IDisposable 的对象&#xff0c;它的生命周期就是从实例化时开始…...

著名的电子商务网站/临沂seo优化

即使在这个网络发达的社会&#xff0c;仍有很多人喜欢带有纸感的明信片。当看到很多漂亮明信片&#xff0c;是不是很心动。其实利用PS就可轻松制作个明信片。那么用PS如何制作明信片&#xff1f;想学习的朋友和小编一起来DIY明信片吧&#xff01;PS制作明信片步骤&#xff1a;1…...

wordpress5.2发布/徐州seo招聘

1.Ajax全称&#xff1a;“Asynchronous JavaScript and XML”&#xff0c;异步javaScript和XML。在不重载整个网页的情况下&#xff0c;AJAX 通过后台加载数据&#xff0c;并在网页上进行显示。(可以实现页面部分更新)异步&#xff1a;(无需等到dom操作完成)同步&#xff1a;同…...