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

数据结构之顺序表,实现顺序表的增删改查

目录

一、顺序表的概念

二、顺序表的分类

1.静态顺序表 

2.动态顺序表

3.顺序表的增删改查

总结



一、顺序表的概念

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

二、顺序表的分类

1.静态顺序表   

使用定长数组存储元素

#define N 7typedef int SLDataType;typedef struct SeqList{SLDataType array[N];  //定长数组size_t size ;   //有效数据的个数
}SeqList;

静态顺序表只适用于确定需要多少数据的情况,N大了空间浪费,N小了不够用,所以一般用动态顺序表,按需分配空间。

2.动态顺序表

使用动态开辟的数组存储

//顺序表的动态存储
typedef struct SeqList
{SLDataType * array;   //指向动态开辟的数组size_t size;       //有效的数据个数sieze_t capacity; //容量空间的大小
}SeqList;

3.顺序表的增删改查

  • 顺序表的初始化

        顺序表为一个结构体,里面有3个参数:指向数组的指针,顺序表中的有效数字个数,顺序表的大小,初始化的时候全部置空

//顺序表的初始化
void SLInit(SL * ps)
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
  • 尾插

        首先,在尾部插入数据,先判断顺序表中的大小是否能插入,如果不能,需要扩容,如果可以插入,则要找到尾的位置,然后把数据放入,放入的时候根据size找下标,放入a中。ps->a[ps->size];此时size++

void SLCheckCapacity(SL * ps)
{assert(ps);//如果容量满了if(ps->size == ps->capacity){//如果是第一次开辟空间 给4个字节 // 后面开辟,扩容到二倍int newCapacity = ps->capacity == 0 ?4: ps->capacity * 2;//扩容的地址 realloc 形参为第一次开辟的地址和要扩容的大小 //要扩容的单位 字节 字节个数=扩容几个 * 类型SLDataType * tmp = (SLDataType * ) realloc(ps->a, newCapcity * sizeof(SLDataType));//如果开失败if(tmp == NULL){perror("realloc fail");exit(-1);}//开成功 地址给a (realloc可能为原地也可能为异地) 相当于一次原地扩容ps->a = tmp;// 容量大小改变ps->capacity = newCapacity;
}void SLPushBack(SL * ps,SLDataType x)
{assert(ps);//检查容量SLCheckCapacity(ps);ps->a[ps->size] = x;   //x要放入a数组中,根据现在的数据个数(即数组的最后一个)找下标赋值插入ps->size++;
}
  • 尾删

        先判断顺序表是否删空了,如果空了返回。如果不空,a数组中的尾部位置数置0,size--.

void SLPopBack(SL * ps)
{assert(ps);assert(ps->size >0);ps->a[ps->size-1] = 0;   //注意下标的位置,size是有效数据个数,size-1是最后一个数的位置ps->size--;
}
  • 头插

        插入之前需要先判断能否插入,使用checkCapacity检查,如果可以插入,头插,需要把后面的数字往后挪,往后挪有两种方式:从前往后,从后往前,此时需要从后往前,否则会覆盖掉后一个数字,挪动结束后,第一个位置插入,插入之后size++

//头插
void SLPushFront(SL * ps,SLDataType)
{assert(ps);SLCheckCapacity(ps);//挪动数据int end = ps->size-1;while(end>=0){ps->a[end+1]= ps->a[end];end--;}ps->a[0] = x;ps->size++;
}
  • 头删

        先判断是否为空的顺序表,然后删除第一个,后面的数据往前挪动,挪动的时候从前往后挪,不会覆盖,删除结束之后size--

//头删
void SLPopFront(SL * ps)
{assert(ps->size >0)int begin = 1; //注意这里begin设置为1 while(begin<ps->size){ps->a[begin-1] = ps->a[begin];   //覆盖前一个begin++;}ps->size--;
}
  • 查找

       遍历顺序表, 根据数据查找位置,找到了就返回数据的下标

int Find(SL * ps, SLDataType x)
{assert(ps);for(int i = 0;i<ps->size;i++){if(ps->a[size] == x){return i;}}//没找到return -1;
}
  • 在pos位置插入x

        先判断pos位置的合法性,是否在这个顺序表的范围里,然后判断是否能插入,如果不可以,需要扩容;如果可以插入,pos位置之后的先往后挪动,end>=pos,然后pos位置插入数据

void SLInsert(SL * ps,SLDataType x)
{assert(ps);//判断pos的合法性 在这个顺序表中assert(pos>=0);assert(pos<=ps->size);//判断是否要扩容SLCheckCapacity(ps);int end = ps->size - 1;//pos位置之后的挪动 往后挪while(end>=pos){ps->a[end+1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}
  • 在pos位置删除x

先判断pos的合法性,判断顺序表是否为空,如果可以删除,pos位置之后的往前挪动,size--

void SLErase(SL * ps,int pos)
{assert(ps);assert(pos>=0);assert(pos<=ps->size);assert(ps->size >0);//挪动数据覆盖int begin = pos+1;while(begin<ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--;
  • 顺序表的打印

        遍历打印即可,打印数组中的内容

void SLPrint(SL * ps)
{assert(ps);for(int i = 0;i<ps->size;i++){printf("%d",ps->a[i];);}
}
  • 顺序表的销毁

        将顺序表中的数组内容置空,size和capacity均置空

void SLDestroy(SL * ps)
{assert(ps);if(ps->a){free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;}}

总结

本文主要介绍了顺序表的结构,以及对顺序表的操作:增删改查等。如有错误请指正。

相关文章:

数据结构之顺序表,实现顺序表的增删改查

目录 一、顺序表的概念 二、顺序表的分类 1.静态顺序表 2.动态顺序表 3.顺序表的增删改查 总结 一、顺序表的概念 顺序表是一段物理地址连续的村塾单元依次存储数据元素的线性结构&#xff0c;一般情况下使用数组存储&#xff0c;在数组上完成数据的增删改查。 二、顺…...

HTB-Jeeves

HTB-Jeeves信息收集80端口50000端口![在这里插入图片描述](https://img-blog.csdnimg.cn/5824bf345bc040ee9e449bebeade9495.png)开机kohsuke -> Administrator信息收集 80端口 ask jeeves是一款以回答用户问题提问的自然语言引擎&#xff0c;面对问题首先查看数据库里是否…...

大力出奇迹——GPT系列论文学习(GPT,GPT2,GPT3,InstructGPT)

目录说在前面1.GPT1.1 引言1.2 训练范式1.2.1 无监督预训练1.2.2 有监督微调1.3 实验2. GPT22.1 引言2.2 模型结构2.3 训练范式2.4 实验3.GPT33.1引言3.2 模型结构3.3 训练范式3.4 实验3.4.1数据集3.5 局限性4. InstructGPT4.1 引言4.2 方法4.2.1 数据收集4.2.2 各部分模型4.3 …...

Linux ubuntu更新meson版本

问题描述 在对项目源码用meson进行编译时&#xff0c;可能出现以下错误 meson.build:1:0: ERROR: Meson version is 0.45.1 but project requires > 0.58.0. 或者 meson_options.txt:1:0: ERROR: Unknown type feature. 等等&#xff0c;原因是meson版本跟设置的不适配。 …...

匹配yyyy-MM-dd日期格式的正则表达式

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ 解释&#xff1a; ^&#xff1a;匹配行的开头 \d{4}&#xff1a;匹配四个数字&#xff0c;表示年份 -&#xff1a;匹配一个横杠 (0[1-9]|1[0-2])&#xff1a;匹配01到12的月份&#xff0c;0开头的要匹配两位数字&#xff0c;1开…...

【失业预告】生成式人工智能 (GAI)AIGC

文章目录AIGCGAIAGI应用1. 计算机领域2. 金融领域3. 电商领域4. C端娱乐5. 游戏领域6. 教育领域7. 工业领域8. 医疗领域9. 法律领域10. 农业/食品领域11. 艺术/设计领域来源AIGC AIGC&#xff0c;全称为Artificial Intelligence Generated Content&#xff0c;是一种新型的人工…...

TensorFlow 2.0 的新增功能:第一、二部分

原文&#xff1a;What’s New in TensorFlow 2.0 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如何实现目…...

Spring Boot配置文件详解

前言 Spring Boot 官方提供了两种常用的配置文件格式&#xff0c;分别是properties、YML格式。相比于properties来说&#xff0c;YML更加年轻&#xff0c;层级也是更加分明。 1. properties格式简介 常见的一种配置文件格式&#xff0c;Spring中也是用这种格式&#xff0c;语…...

实习面试题整理1

1、进行一下自我介绍 2、介绍一下你简历里的两个项目 3、说说vue的生命周期&#xff08;具体作用&#xff09; 4、说说你对vue单页面和多页面应用的理解 5、说说vue里自带的数组方法&#xff08;七种&#xff0c;往响应式数据上靠&#xff09; 6、说说vue双向数据绑定&…...

最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…...

OpenCV——常用函数

cv::circle(overlay, pt, 2, cv::Scalar(0,green,red),-1); 使用OpenCV库中的circle()函数在图像上绘制圆形的代码。 具体来说&#xff0c;它的参数如下&#xff1a; - overlay&#xff1a;图像&#xff0c;在该图像上绘制圆形&#xff1b; - pt&#xff1a;圆心位置的cv:…...

超详细从入门到精通,pytest自动化测试框架实战-fixture多样玩法(九)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在编写测试用例&…...

OJ练习第70题——困于环中的机器人

困于环中的机器人 力扣链接&#xff1a;1041. 困于环中的机器人 题目描述 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受…...

运行时内存数据区之虚拟机栈——局部变量表

这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样&#xff0c;Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;也是线程私有的&#xff0c;它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型&#xf…...

Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

场景 1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解&#xff0c; 然后综合各个小问题&#xff0c;得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次…...

2个 windows 下的网络测试工具

环境windows 10 64bittcpingtcproute简介TCPing 和 TCProute 都是 windows 下的用于测试 TCP 连接的工具&#xff0c;它们可以帮助用户确定网络连接的可用性和响应时间。TCPing下载地址&#xff1a; https://elifulkerson.com/projects/tcping.phpTCPing 通过向目标主机发送 TC…...

HDU - 4734 -- F(x)

题目如下&#xff1a; For a decimal number x with n digits (AnAn−1An−2...A2A1)(A_nA_{n-1}A_{n-2} ... A_2A_1)(An​An−1​An−2​...A2​A1​), we define its weight as F(x)An∗2n−1An−1∗2n−2...A2∗2A1∗1.F(x) A_n * 2^{n-1} A_{n-1} * 2^{n-2} ... A_2 *…...

【音视频第10天】GCC论文阅读(1)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的&#xff0c;找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model3.Fe…...

如何进行移动设备资产管理

随着越来越多的移动设备进入和访问组织的企业资源&#xff0c;管理员必须监视和控制对企业数据的访问。与传统工作站不同&#xff0c;传统工作站位于企业的物理工作区内&#xff0c;移动设备从多个位置使用&#xff0c;从而使移动资产管理过程更加复杂。 什么是移动资产管理 …...

使用国密SSL证书,实现SSL/TLS传输层国密改造

密码是保障网络空间安全可信的核心技术和基础支撑&#xff0c;通过自主可控的国产密码技术保护重要数据的安全&#xff0c;是有效提升我国信息安全保障水平的重要举措。因此&#xff0c;我国高度重视商用密码算法的应用并出台相关政策法规&#xff0c;大力推动国产商用密码算法…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...