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

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

 

 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;
}

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

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

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

        

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

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

相关文章

AI Agent在情景猜谜场景下的AgentBench基准测试

目录 AgentBench评估哪些场景? 近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现…

数字人学习目录

数字人学习目录 百度PaddlePaddleHub图像风格迁移模型pp-tinypose模型 PaddleGANPaddleLitePaddleDetectionPP-TinyPose 人体骨骼关键点识别 PaddleSpeechVisualDLPaddleBobo TransformerWav2LibCLIPFFMpeg模型库数据集学习天地PythonJupyter Notebook Unity3DUE 百度Paddle P…

docker之Consul环境的部署

目录 一.Docker consul的介绍 1.1template模板(更新) 1.2registrator&#xff08;自动发现&#xff09; 1.3agent(代理) 二.consul的工作原理 三.Consul的特性 四.Consul的使用场景 五.搭建Consul的集群 5.1需求 5.2部署consul 5.3主服务器[192.168.40.20] 5.4client部署&…

华为OD-最大括号深度

题目描述 一个合法的括号匹配序列有以下定义: 1、空串""是一个合法的括号匹配序列 2、如果"X"和"Y"都是合法的括号匹配序列,"XY"也是一个合法的括号匹配序列 3、如果"X"是一个合法的括号匹配序列,那么"(X)"也是一…

ChatGPT:记一次超复杂的KVM桌面系统连接问答记录

​ KVM切换器可以使多台电脑共用键盘&#xff0c;显示器&#xff0c;鼠标&#xff0c;当电脑很多&#xff0c;显示器也是分为主从&#xff0c;需要共用键盘鼠标和音响设备&#xff0c;而买KVM切换器只有2个通道4进2出不满足需求时&#xff0c;就要组合多个KVM使用&#xff0c;大…

尽管价格走势平淡,但DeFi领域仍然非常有趣

DEX代表加密货币交易的创新&#xff0c;就在去年&#xff0c;这些去中心化、非托管平台的活动与CEX比相形见绌&#xff0c;但自那时以来&#xff0c;DEX已经迎头赶上&#xff0c;并在几个月内超越了中心化服务交易量&#xff0c;让用户能够更好地控制自己的资产和进行新类型的交…

oracle通配符大全

用于where比较条件的有 &#xff1a; 等于&#xff1a;、<、<、>、>、<> >,<:大于&#xff0c;小于 >.<:大于等于&#xff0c;小于等于 :等于 !,<>,^:不等于 包含&#xff1a;in、not in exists、not exists 范围&#xff1a;betwe…

python实战【外星人入侵】游戏并改编为【梅西vsC罗】(球迷整活)——搭建环境、源码、读取最高分及生成可执行的.exe文件

文章目录 &#x1f3a5;前言&#x1f4bc;安装Pygame&#x1f50b;游戏的实现读写并存储【外星人入侵】游戏最高分游戏源码alien_invasion.pygame_functions.pyship.pyalien.pybullet.pybutton.pyscoreboard.pygame_stats.pysettings.py宇宙飞船和外星人的 .bmp类型文件 &#…

Spark 图计算ONEID 进阶版

0、环境信息 本文采用阿里云maxcompute的spark环境为基础进行的&#xff0c;搭建本地spark环境参考搭建Windows开发环境_云原生大数据计算服务 MaxCompute-阿里云帮助中心 版本spark 2.4.5&#xff0c;maven版本大于3.8.4 ①配置pom依赖 详见2-1 ②添加运行jar包 ③添加配置信…

JVM——JVM 垃圾回收

文章目录 写在前面本节常见面试题本文导火索 1 揭开 JVM 内存分配与回收的神秘面纱1.1 对象优先在 eden 区分配1.2 大对象直接进入老年代1.3 长期存活的对象将进入老年代1.4 动态对象年龄判定1.5 主要进行 gc 的区域 2 对象已经死亡&#xff1f;2.1 引用计数法2.2 可达性分析算…

java面试基础 -- 深克隆 浅克隆

引例 说到java的克隆你还记得多少? 一说到克隆你可能就会想起来那个接口, 没错, 他就是Cloneable Cloneable是java里面内置的很常用的接口, 我们说 Object类中也有一个clone方法: 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedEx…

如何下载和安装google字体(中文)

打开&#xff1a;https://fonts.google.com/ 点击字体 下载 解压 双击安装 查看 控制面板-》字体-》

scalacache 配合 guava

代码 package com.yy.guavaimport scalacache._ import scalacache.guava._ import scalacache._ import scalacache.guava._ import com.google.common.cache.CacheBuilder import scalacache.modes.sync._ import scalacache.serialization.binary._ import scalacache._ im…

.net日志系统

.NET 平台提供了强大的日志记录系统,用于在应用程序中记录各种事件、错误和调试信息。最常用的日志记录库是 Microsoft.Extensions.Logging,它是一个通用的日志接口和基础框架,可以与多种日志实现集成。以下是如何使用 .NET 日志系统的基本步骤: 安装 NuGet 包:首先,您需…

大数据课程K1——Spark概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的背景; ⚪ 了解Spark的特点; ⚪ 掌握Spark的生态系统模块、使用模式; ⚪ 掌握Spark的单机模式安装; 一、简介 1. 背景 Spark是UC Berkeley AMP lab (加州大学伯克利分校…

武汉凯迪正大—变比组别测试仪

一、概述 在电力变压器的半成品、成品生产过程中&#xff0c;新安装的变压器投入运行之前以及根据国家电力部的预防性试验规程中&#xff0c;要求变压器进行匝数比或电压比测试。传统的变比电桥操作繁琐&#xff0c;读数不直观&#xff0c;且要进行必要的换算&#xff0c;测试时…

git拉取失败/git fatal终极解决方法

前言 被折磨不下20次总结出来的终极方案 步骤 0 首先关闭代理试试&#xff0c;不行就下一步 1 重置代理或者取消代理的方式 git config --global --unset http.proxy git config --global --unset https.proxy添加全局代理 git config --global http.proxy git config …

Docker容器:Docker-Compose

Docker容器&#xff1a;Docker-Compose 一.Docker-Compose概念 1.Docker-Compose使用场景 一个Dockerfile模板文件可以定义一个单独的应用容器&#xff0c;如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案&#xff0c;今天是介绍 Docker 官方产品 Docker Com…

Java 关键技术汇总-备忘录

java关键点总结&#xff1a; volatile&#xff1a;保证可见性visibility &#xff08;并不能保证原子性&#xff09; java线程会缓存变量的值&#xff0c;可能导致缓存值和主内存的值不一致。即缓存一致性问题。Java内存模型规定了所有的变量都存储在主内存中&#xff0c;每条…

python 模块lxml 处理 XML 和 HTML 数据

xpath&#xff1a;https://blog.csdn.net/randy521520/article/details/132432903 一、安装 XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言&#xff0c;可用来在 HTML\XML 文档中对元素和属性进行遍历。 pip install lxml二、使用案例 from lxml impo…