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

数据结构【顺序表】

目录

线性表

顺序表

概念与结构

分类

静态顺序表

动态顺序表

动态顺序表的实现

在头文件中创建结构体

初始化顺序表

销毁顺序表(可以留到后面再看)

尾插数据

申请空间

打印顺序表数据

头插数据

尾删除数据

头删除数据

在指定位置插入数据

在指定位置删除数据

查询数据

顺序表算法题

移除元素

删除有序数组中的重复项

合并两个有序数组

代码


线性表

++++1

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的 数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性 表在物理上存储时,通常以数组和链式结构的形式存储。

线性表是具有相同特性的集合,就比如现实生活中的,水果有苹果,香蕉,西瓜等等....,这些都是水果类型的。线性表:顺序表、链表、栈、队列、字符串等等...


顺序表

概念与结构

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组 存储。

逻辑结构:就像一家早餐店早上有很多人排队,排成一条线,这就是逻辑结构,都是线性的

顺序表也是数组,顺序表在物理结构不一定连续,在逻辑结构是连续的,


顺序表和数组的区别? 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝。

下面这张图,苍蝇馆子就像数组,米其林餐厅就像顺序表,一个普普通通的炒西蓝花,在米其林餐厅西蓝花+料汁+小饰品+摆盘就变成了绿野仙踪,

顺序表也是一样在数组的基础上加了(增加数据,删除数据,修改数据,查找数据)就变成了顺序表


分类

静态顺序表

概念:使⽤定⻓数组存储元素

静态数组只需要,定长数组,有效数据个数

静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费

静态顺序表不推荐用,如果要存放用户数据的话,当数据存满了,剩下的数据就会丢失。


动态顺序表

动态顺序表需要有效个数,空间的容量,a也可以说就是个数组


动态顺序表的实现

代码在文章最后

我们需要创建一个seqlist.h头文件,seqlist.c文件存放函数,还有一个.c的测试文件。


在头文件中创建结构体

把int 重命名为 data,这样方便修改类型,就不用一个一个修改了


初始化顺序表

我们要在头文件声明一下,这样的话我们可以方便查看有什么函数,就像我们看一本书,书有目录方便我们阅读。


初始化我们需要把arr赋值为NULL,有效个数和空间容量赋值为0就好了。

如果我们现在申请空间,会导致空间满了我们没法调整。

我们只需要添加数据的数据(申请/调整)空间就好了。


我们可以发现初始化成功了


销毁顺序表(可以留到后面再看)

这里我先讲顺序表销毁,也可以先往后看,最后再来看销毁。

我们申请空间用完了需要还,不然存在空间泄露。


if判断结构体里arr的有没有数据,有数据就free释放空间,有效个数和空间容量赋值为0。

arr没有数据的话,就是为NULL,就不释放空间了。


尾插数据

尾插数据我们只需要在size这个位置插入数据,然后++就可以了。

没有数据的话会在0下标位置插入数据,然后++。


这里有2个参数,第二个参数是要插入的数据


申请空间

空间容量 等于 有效个数,就说明空间不够,需要申请空间。

 申请空间2倍2倍增加,这样可以避免空间不够,或者空间给多了,2倍2倍增加可以小部分避免空间不够,或者空间给多了。

0乘任何数都得0。空间容量一开始就是0,我们需要先给个4。

这有2个临时的变量。

三目操作符这个,空间容量等于0,就给4,不等于0 就空间大小乘2。

然后realloc给 arr 申请空间 ,app得到的是字节,还需要乘类型大小,才能得到类型需要的空间。

if判断是不是等于NULL。是就报错然后退出,

不是就把创建的临时变量tab赋值给arr,

app赋值给koj空间容量。



在arr下标为size的位置插入数据。然后++。


我们可以看到,1,2,3,4都有了。


打印顺序表数据


i小于有效个数


我们可以看到1,2,3,4都打印出来了。


头插数据


这个就是把全部数据往后移动1位,然后在0下标插入数据


打印结果


尾删除数据


尾删除,我们只需要把size往后移动1位就行了


我们可以看到4没了。

头删除数据


就是把1下标到3下标往前移动1位,就行了。


我们发现1删除了


在指定位置插入数据

这里多了个参数,int a这个是要插入数据的下标,要把数据插入那个下标。


把a下标往后的数据,向后移动1位,然后在a下标位置插入数据。


我们可以发现在2下标位置,插入了99


在指定位置删除数据

int a是要删除的下标


把a下标位置后面的数据,向前移动1位


我们发现2删除了,2的下标是1


查询数据


我们可以通过循环的方式查询,找到了返回下标


我们可以看到,返回的下标是2


顺序表算法题

移除元素

https://leetcode.cn/problems/remove-element/description/

int s1=0;int s2=0;while(s1<numsSize){if(nums[s1]==val){s1++;}else{nums[s2++]=nums[s1++];}}return s2;
删除有序数组中的重复项

 https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/

int sl1=0;int sl2=0;while(sl1 < numsSize){if(nums[sl1]==nums[sl2]){sl1++;}else{sl2++;nums[sl2]=nums[sl1];}}return sl2+1;
合并两个有序数组

 https://leetcode.cn/problems/merge-sorted-array/description/

 int s1 = m-1;int s2 = n-1;int s3 = m + n - 1;while(s1>=0 && s2 >=0 ){if(nums1[s1]<nums2[s2]){nums1[s3--]=nums2[s2--];}else{nums1[s3--]=nums1[s1--];}}while(s2>=0){nums1[s3--]=nums2[s2--];}

代码

seqlist.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int data;
typedef struct sxb
{data* arr;int size;//有效个数int koj;//空间容量}SL;//给整个结构体命名SL//初始化顺序表
void csh(SL* r);
//销毁顺序表
void xiaoh(SL* r);
//尾插数据
void weic(SL* r,data x);
//打印
void day(SL* r);
//头插数据
void toc(SL* r,data x);
//尾删除
void weisc(SL* r);
//头删除
void tosc(SL* r);
//指定位置插入
void zhidcr(SL* r,int a,data x);
//在指定位置删除数据
void zhidsc(SL* r, int a);
//查询数据
int cxsj(SL* r, data x);

seqlist.c

#include"seqlist.h"
//初始化顺序表
void csh(SL* r)
{r->arr = NULL;r->size = 0;r->koj = 0;
}
//销毁顺序表
void xiaoh(SL* r)
{if (r->arr != NULL){free(r->arr);}r->koj = 0;r->size = 0;
}
//判断空间
void pdkoj(SL* r)
{if (r->koj == r->size){//三目操作符int app = r->koj == 0 ? 4 : r->koj * 2;//申请空间data* tab = (data*)realloc(r->arr, app * sizeof(data));if (tab == NULL){perror("realloc");exit(1);}//赋值r->arr = tab;r->koj = app;}
}//尾插数据
void weic(SL* r,data x)
{assert(r);//和r != NULL一样//判断空间够不够,不够(调整/开辟)空间pdkoj(r);//插入数据r->arr[r->size] = x;//size + 1r->size++;
}
//打印
void day(SL* r)
{assert(r);//和r != NULL一样//循环打印for (int i = 0; i < r->size; i++){printf("%d ", r->arr[i]);}
}
//头插数据
void toc(SL* r, data x)
{assert(r);pdkoj(r);//把全部数据,都往后移动1位for (int i = r->size; i > 0; i--){r->arr[i] = r->arr[i - 1];}//在0下标插入数据r->arr[0] = x;r->size++;
}//尾删除
void weisc(SL* r)
{assert(r);//把size向后移动1位r->size--;
}//头删除
void tosc(SL* r)
{assert(r);//把1下标 到 3下标往前移动1位for (int i = 0; i < r->size-1; i++){r->arr[i] = r->arr[i + 1];}//删除完size往后移动1位r->size--;
}
//指定位置插入
void zhidcr(SL* r,int a, data x)
{assert(r);pdkoj(r);//把a下标往后的数据移动1位for (int i = r->size; i > a; i--){r->arr[i] = r->arr[i - 1];}//在a下标的位置插入数据r->arr[a] = x;r->size++;
}
//指定位置删除数据
void zhidsc(SL* r, int a)
{assert(r);//把a下标位置后面的数据,向前移动1位for (int i = a; i < r->size-1; i++){r->arr[i] = r->arr[i + 1];}//size--r->size--;
}
//查询数据
int cxsj(SL* r, data x)
{assert(r);for (int i = 0; i < r->size; i++){if (r->arr[i] == x){//找到了返回下标return i;}}//没找到返回-1return -1;
}

测试.c文件

#include"seqlist.h"
void cs()
{SL add;//初始化csh(&add);//尾插weic(&add, 1);weic(&add, 2);weic(&add, 3);weic(&add, 4);//打印day(&add);//查询数据int q = cxsj(&add, 3);if (q < 0){printf("没有找到\n");}else{printf("找到了,下标是: %d", q);}//销毁xiaoh(&add);
}
int main()
{cs();return 0;

相关文章:

数据结构【顺序表】

目录 ​ 线性表 顺序表 概念与结构 分类 静态顺序表 动态顺序表 动态顺序表的实现 在头文件中创建结构体 初始化顺序表 销毁顺序表&#xff08;可以留到后面再看&#xff09; 尾插数据 申请空间 打印顺序表数据 头插数据 尾删除数据 头删除数据 在指定位置插…...

【JavaScript 报错】未捕获的类型错误:Uncaught TypeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…...

html+css+js随机验证码

随机画入字符、线条 源代码在图片后面 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回 图示 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"…...

WPS打开PDF文件的目录

WPS打开PDF文件的目录 其实WPS中PDF文件并没有像Word那样标准的目录&#xff0c;但是倒是有书签&#xff0c;和目录一个效果 点击左上角书签选项&#xff0c;或者使用Alt Shift 1快捷键即可...

常见 Web漏洞分析与防范研究

前言&#xff1a; 在当今数字化时代&#xff0c;Web应用程序扮演着重要的角色&#xff0c;为我们提供了各种在线服务和功能。然而&#xff0c;这些应用程序往往面临着各种潜在的安全威胁&#xff0c;这些威胁可能会导致敏感信息泄露、系统瘫痪以及其他不良后果。 SQL注入漏洞 …...

暗黑魅力:Xcode全面拥抱应用暗黑模式开发指南

暗黑魅力&#xff1a;Xcode全面拥抱应用暗黑模式开发指南 随着苹果在iOS 13和iPadOS 13中引入暗黑模式&#xff0c;用户可以根据自己的喜好或环境光线选择不同的界面主题。作为开发者&#xff0c;支持暗黑模式不仅能提升用户体验&#xff0c;还能彰显应用的专业性。Xcode提供了…...

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…...

在 Windows 平台搭建 MQTT 服务

引言 MQTT 是一种轻量级、基于发布/订阅模式的消息传输协议&#xff0c;旨在用极小的代码空间和网络带宽为物联网设备提供简单、可靠的消息传递服务。MQTT 经过多年的发展&#xff0c;如今已被广泛应用于资源开采、工业制造、移动通信、智能汽车等各行各业&#xff0c;使得 MQ…...

jdevelope安装

准备 1.jdk1.8&#xff08;已经安装不做记录&#xff09; 2.下载jdevelope安装包 3.安装包安装jdevelope开发工具 4.创建或导入项目 下载jdevelope安装包 官网下载地址&#xff1a;https://edelivery.oracle.com 安装包安装jdevelope开发工具 cmd管理员权限运行安装脚本…...

排序(一)——冒泡排序、直接插入排序、希尔排序(BubbleSOrt,InsertSort,ShellSort)

欢迎来到繁星的CSDN&#xff0c;本期的内容主要包括冒泡排序(BubbleSort&#xff09;&#xff0c;直接插入排序(InsertSort)&#xff0c;以及插入排序进阶版希尔排序&#xff08;ShellSort&#xff09;。 废话不多说&#xff0c;直接上正题&#xff01; 一、冒泡排序 冒泡排序…...

synchronized关键字详解(全面分析)

目录 synchronized关键字详解1、synchronized关键字简介2、synchronized作用和使用场景作用使用场景①、用在代码块上(类级别同步)②、用在代码块上(对象级别同步)③、用在普通方法上(对象级别同步)④、用在静态方法上(类级别同步)总结&#xff1a; 3、synchronized底层原理&am…...

数据建设实践之大数据平台(三)

安装hadoop 上传安装文件到/opt/software目录并解压 [bigdatanode101 software]$ tar -zxvf hadoop-3.3.5.tar.gz -C /opt/services/ 配置环境变量 [bigdatanode101 ~]$ sudo vim /etc/profile.d/bigdata_env.sh export JAVA_HOME/opt/services/jdk1.8.0_161 export ZK_HO…...

TypeScript中的交叉类型

交叉类型&#xff1a;将多个类型合并为一个类型&#xff0c;使用&符号连接。 type AProps { a: string }type BProps { b: number }type allProps AProps & BPropsconst Info: allProps {a: 小月月,b: 7} 我们可以看到交叉类型是结合两个属性的属性值&#xff0c;那…...

CNN -1 神经网络-概述2

CNN -1 神经网络-概述2 一:神经网络(operator)1> 线性层(Fully Connected Layer)2> 卷积层(Convolutional Layer)3> 池化层(Pooling Layer)4> 循环层(Recurrent Layer)5> 归一化层(Normalization Layer)6> 激活函数(Activation Function)7>…...

利用js实现图片压缩功能

图片压缩在众多应用场景中扮演着至关重要的角色&#xff0c;尤其是在客户端上传图片时。原始图片往往体积庞大&#xff0c;直接上传不仅消耗大量带宽资源&#xff0c;还可能导致上传速度缓慢&#xff0c;严重影响用户体验。因此&#xff0c;在图片上传至服务器前对其进行压缩处…...

2024.7.10 刷题总结

2024.7.10 **每日一题** 2970.统计移除递增子数组的数目 Ⅰ&#xff0c;这道题是一个考察双指针的题目&#xff0c;也考察了数组的基本性质。题目的意思是要统计有多少个子数组能满足移除后剩下的元素为严格递增的关系&#xff0c;刚开始没考虑到移除的元素要是连续的&#xff…...

ES6 async 函数详解 (十)

async 函数是什么&#xff1f;一句话&#xff0c;它就是 Generator 函数的语法糖。 const gen function* () {const f1 yield readFile(/etc/fstab);const f2 yield readFile(/etc/shells);console.log(f1.toString());console.log(f2.toString()); };const asyncReadFile …...

【安全设备】入侵检测

一、什么是入侵检测 入侵检测是一种网络安全技术&#xff0c;用于监测和识别对计算机系统或网络的恶意使用行为或未经授权的访问。入侵检测系统&#xff08;IDS&#xff09;是实现这一目标的技术手段&#xff0c;其主要目的是确保计算机系统的安全&#xff0c;通过及时发现并报…...

07浅谈大语言模型可调节参数tempreture

浅谈temperature 什么是temperature&#xff1f; temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性&#xff1a; 控制确定性&#xff1a; temperature参数可以控制模型生成文本的确定性&#xff0c;大部分模型中temperatur…...

Redis数据同步

文章简单介绍基于redis-shake的redis数据同步&#xff0c;该工具基于每个节点同步数据&#xff0c;即每个主节点需同步一次&#xff0c;才能完成整个redis集群的数据同步。 1、redis节点操作 ### 查看redis版本 ./bin/redis-server --version### 登录redis ./bin/redis-cli -…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...