当前位置: 首页 > 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;大力推动国产商用密码算法…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...