【落羽的落羽 数据结构篇】顺序表

在这里插入图片描述

文章目录

  • 一、线性表
  • 二、顺序表
    • 1. 概念与分类
    • 2. 准备工作
    • 3. 静态顺序表
    • 4. 动态顺序表
      • 4.1 定义顺序表结构
      • 4.2 顺序表的初始化
      • 4.3 检查空间是否足够
      • 4.3 尾部插入数据
      • 4.4 头部插入数据
      • 4.5 尾部删除数据
      • 4.6 头部删除数据
      • 4.7 在指定位置插入数据
      • 4.8 在指定位置删除数据
      • 4.9 顺序表的销毁

一、线性表

线性表是若干个具有相同特性的数据元素的有限序列,是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串,等等。线性表在逻辑上是线性结构的,但在物理层面上(地址)不一定是线性结构的。
(线性表逻辑上连续,地址不一定连续)

本篇文章先来了解顺序表。

二、顺序表

1. 概念与分类

顺序表的概念:顺序表是用一段物理地址连续的存储单元一次存储数据元素的线性结构,一般情况下采用数组存储。
顺序表和数组的区别在于:顺序表的底层结构是数组,它是对数组的封装,实现了常用的增删查改等功能,是一个结构体类型。

一般情况下,顺序表可以分为:静态顺序表、动态顺序表

2. 准备工作

  • 顺序表的英文是SeqList,一在实际写代码过程中,我们常常typedef重命名为SL方便书写。
  • 由于顺序表存储的数据类型有很多种可能,在一个项目实战中,面对成百上千行代码,一旦要修改顺序表存放数据类型,一个个修改会很麻烦。所以我们可以一开始就定义typedef 类型 SLDataType;,然后创建顺序表的数组,或是其他要写到顺序表元素类型的地方,直接写成SLDataType。这样,需要改变数据类型时,直接改typedef那里就可。
  • 通常我们把结构体的定义、函数的声明放在SeqList.h 头文件中,把顺序表的功能实现方法代码放在SeqList.c 源文件中(它要#include"SeqList.h"),每一个功能都封装成一个函数,测试顺序表功能则在test.c 中完成。

这些道理不仅适用于本文,未来学习其他内容也是一样的,以后就不再提醒了。

3. 静态顺序表

静态顺序表,就是固定大小的顺序表,使用定长数组存储元素:

typedef struct SeqList
{SLDataType arr[7];  //定长数组int size;           //有效元素个数
}SL;

其实它和数组也没有太大区别了,只是对数组进行了简单封装,
静态顺序表的大小无法再改变,因此面对空间给大了或空间给小了的情况时无能为力。所以在实际项目中我们很少用到它,动态顺序表才是更重要的。

在这里插入图片描述

4. 动态顺序表

动态顺序表的特点是空间按需申请。按需申请,说明数组的内存大小要靠动态内存分配实现。下面我们就来演示一下常见的动态顺序表的操作:

4.1 定义顺序表结构

typedef struct SeqList
{SLDataType* arr;//数组首元素地址int size;       //有效数据个数int capacity;   //空间大小
}SL;

4.2 顺序表的初始化

//不能进行传值调用,否则修改的只是形参,因此要传址调用
void SLInit(SL* psl)
{psl->arr = NULL;psl->size = psl->capacity = 0;
}

测试:
在这里插入图片描述

4.3 检查空间是否足够

在插入顺序表元素前,我们要确保表的空间足够,当size == capacity说明空间已满,需要扩容。而假如capacity还为0,则先自己给定一个大小;不为0,一般呈二倍扩容,这是由概率论总结出来的最适合的扩容大小。每个插入数据操作都应该包括这一步。

void SLCheckCapacity(SL* psl)
{if(psl->size == psl->capacity){int newCapacity = (psl->capacity==0)? 5: 2*psl->capacity;SLDataType* tmp = (SLDataType*)realloc(psl->arr, newCapacity*sizeof(SLDataType));if(tmp == NULL){perror("realloc fail!");return 1;}psl->arr = tmp;psl->capacity = newCapacity;}
}

测试:
在这里插入图片描述

4.3 尾部插入数据

我们实现的插入数据函数是单个数据的插入。插入一个新数据,意味着表的有效数据个数size也要++。这个功能是在顺序表的尾部插入一个数据,尾插函数应该有两个参数,被插入的表和被插入的数据:

void SLPushBack(SL* psl, SLDataType x)
{assert(psl); //确保psl不为空SLCheckCapacity(psl);psl->arr[psl->size] = x;psl->size++;
}

测试:
在这里插入图片描述

4.4 头部插入数据

这个功能是在顺序表的头部插入一个数据,参数也是要有两个:

void SLPushFront(SL* psl, SLDataType x)
{assert(psl);SLCheckCapacity(psl);for(int i = psl->size; i>0; i--){psl->arr[i] = psl->arr[i-1];}psl->arr[0] = x;psl->size++;
}

测试:
在这里插入图片描述

4.5 尾部删除数据

这个功能是删除顺序表尾部的一个数据,但实际上并不是“删除”,而是修改size,让这个数据在size的范围之外。这样我们用size的值访问arr时,就访问不到这个数据了。

void SLPopBack(SL* psl)
{assert(psl && psl->size);//psl不能为空,size不能为0,否则没有意义psl->size--;
}

测试:

在这里插入图片描述

4.6 头部删除数据

头删就是真的删除头部一个数据了,会被第二个数据覆盖掉。

void SLPopFront(SL* psl)
{assert(psl && psl->size);for(int i = 0; i < psl->size-1; i++){psl->arr[i] = psl->arr[i+1];}psl->size--;
}

测试:
在这里插入图片描述

4.7 在指定位置插入数据

这个功能有三个参数,一个是顺序表,一个是指定的位置,一个是要插入的数据。pos及之后的数据要整体向后挪动一位。

void SLInsert(SL* psl, int pos, SLDataType x)
{assert(psl);assert(pos>=0 && pos<=psl->size);//确保pos有意义SLCheckCapacity(psl);for(int i = psl->size; i>pos; i--){psl->arr[i] = psl->arr[i-1];}psl->arr[pos] = x;psl->size++;
}

测试:
在这里插入图片描述

4.8 在指定位置删除数据

同样地,pos之后的数据要整体向前挪动一位

void SLErase(SL* psl, int pos)
{assert(psl);assert(pos>=0 && pos<=psl->size);SLCheckCapacity(psl);for(int i=pos; i<psl->size-1; i++){psl->arr[i] = psl->arr[i+1];}psl->size--;
}

测试:
在这里插入图片描述

4.9 顺序表的销毁

void SLDestory(SL* psl)
{if(psl->arr != NULL){free(psl->arr);}psl->arr = NULL;psl->size = psl->capacity = 0;
}

测试:
在这里插入图片描述
以上就是顺序表的部分用法了,但远不止这些,大家可以设计出更多功能的。

本篇完,感谢阅读。
在这里插入图片描述

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

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

相关文章

大模型GUI系列论文阅读 DAY4续:《Large Language Model Agent for Fake News Detection》

摘要 在当前的数字时代&#xff0c;在线平台上虚假信息的迅速传播对社会福祉、公众信任和民主进程构成了重大挑战&#xff0c;并影响着关键决策和公众舆论。为应对这些挑战&#xff0c;自动化假新闻检测机制的需求日益增长。 预训练的大型语言模型&#xff08;LLMs&#xff0…

基于物联网的智能环境监测系统(论文+源码)

1系统的功能及方案设计 本课题为基于物联网的智能环境监测系统的设计与实现&#xff0c;整个系统采用stm32f103单片机作为主控制器&#xff0c;通过DHT11传感器实现智能环境监测系统温度和湿度的检测&#xff0c;通过MQ传感器实现CO2浓度检测&#xff0c;通过光照传感器实现光照…

反向代理模块。。

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

AI工具灵感速递:离线ChatGPT×自然语言全栈开发×智能文件重命名,开发者效率革命!

↓ 关注小前&#xff0c;捕获全球产品灵感 ↓ ⚡️ 1句Slogan榨干产品灵魂 ⚡️ 3秒 get 全球独立开发者的爆款灵感 今日精选速览&#xff1a; ▸ Llamao&#xff1a;离线私密ChatGPT&#xff0c;设备端AI助手 ▸ co.dev&#xff1a;用自然语言打造全栈应用 ▸ Smart Bul…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Update 和 Delete 操作

1. 测试数据 mysql> select* from exam1; ----------------------------------------- | id | name | Chinese | Math | English | ----------------------------------------- | 1 | 唐三藏 | 67.0 | 98.0 | 56.0 | | 2 | 孙悟空 | 87.0 | 78.…

fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)

目录 创建工程创建源文件并编写C代码C仿真综合仿真导出RTL CG导出RTL错误处理&#xff1a; 创建工程 创建源文件并编写C代码 创建源文件(Souces下的hlsv.h和hlsv.cpp&#xff0c;Test Bench下的test_hlsv1.cpp)&#xff1a; hlsv1.h #ifndef HLSV1 #define HLSV1 #include &l…

定西市建筑房屋轮廓数据shp格式gis无偏移坐标(字段有高度和楼层)内容测评

定西市建筑房屋轮廓数据是GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;领域的重要资源&#xff0c;用于城市规划、土地管理、环境保护等多个方面。这份2022年的数据集采用shp&#xff08;Shapefile&#xff09;格式&#xff0c;这是一种…

学习数据结构(1)时间复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…

有限元分析学习——Anasys Workbanch第一阶段笔记梳理

第一阶段笔记主要源自于哔哩哔哩《ANSYS-workbench 有限元分析应用基础教程》 张晔 主要内容导图&#xff1a; 笔记导航如下&#xff1a; Anasys Workbanch第一阶段笔记(1)基本信息与结果解读_有限元分析变形比例-CSDN博客 Anasys Workbanch第一阶段笔记(2)网格单元与应力奇…

设计模式Python版 原型模式

文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对…

【Redis】缓存+分布式锁

目录 缓存 Redis最主要的使用场景就是作为缓存 缓存的更新策略&#xff1a; 1.定期生成 2.实时生成 面试重点&#xff1a; 缓存预热&#xff08;Cache preheating&#xff09;&#xff1a; 缓存穿透&#xff08;Cache penetration&#xff09; 缓存雪崩 (Cache avalan…

小阿卡纳牌

小阿卡纳牌 风&#xff1a;热湿 火&#xff1a;热干 水&#xff1a;冷湿 土&#xff1a;冷干 火风&#xff1a;温度相同&#xff0c;但是湿度不同&#xff0c;二人可能会在短期内十分热情&#xff0c;但是等待热情消退之后&#xff0c;会趋于平淡。 湿度相同、温度不同&#x…

初始JavaEE篇 —— Spring Web MVC入门(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 RequestMappingg 注解介绍 Postman的介绍与使用 PostMapping 与 GetMapping 注解 构造并接收请求 接收简单参数 接收对象…

python -m pip和pip的主要区别

python -m pip和pip的主要区别在于它们与Python环境的关联方式和安装路径。‌ ‌与Python环境的关联方式‌&#xff1a; pip 是直接使用命令行工具来安装Python包&#xff0c;不指定特定的Python解释器。如果系统中存在多个Python版本&#xff0c;可能会导致安装的包被安装到…

golang通过AutoMigrate方法自动创建table详解

一.AutoMigrate介绍 1.介绍 在 Go 语言中&#xff0c;GORM支持Migration特性&#xff0c;支持根据Go Struct结构自动生成对应的表结构,使用 GORM ORM 库的 AutoMigrate 方法可以自动创建数据库表&#xff0c;确保数据库结构与定义的模型结构一致。AutoMigrate 方法非常方便&am…

SuperAGI - 构建、管理和运行 AI Agent

文章目录 一、关于 SuperAGI&#x1f4a1;特点&#x1f6e0; 工具包 二、⚙️安装☁️SuperAGI云&#x1f5a5;️本地&#x1f300; Digital Ocean 三、架构1、SuperAGI 架构2、代理架构3、代理工作流架构4、Tools 架构5、ER图 一、关于 SuperAGI SuperAGI 一个开发优先的开源…

CSAPP学习:前言

前言 本书简称CS&#xff1a;APP。 背景知识 一些基础的C语言知识 如何阅读 Do-做系统 在真正的系统上解决具体的问题&#xff0c;或是编写和运行程序。 章节 2025-1-27 个人认为如下章节将会对学习408中的操作系统与计算机组成原理提供帮助&#xff0c;于是先凭借记忆将其简单…

如何实现滑动删除功能

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了GestureDetector Widget相关的内容,本章回中将介绍Dismissible Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Dismissible是一个事件响应Widget,它和GestureDetector类…

【数据结构】_链表经典算法OJ:环形链表的约瑟夫问题

目录 1. 题目链接及描述 2. 解题思路 3. 程序 1. 题目链接及描述 题目链接&#xff1a;环形链表的约瑟夫问题_牛客题霸_牛客网 题目描述&#xff1a; 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数…

装饰SpringMVC的适配器实现响应自动包装

文章目录 1.common-tool-starter1.目录结构2.ResultWrapper.java 2.common-web-starter1.目录结构2.IgnoredResultWrapper.java 自定义注解&#xff0c;忽略对返回结果的自动包装3.ReturnValueHandlersDecorator.java 对适配器进行扩展的装饰器4.WebAutoConfiguration.java 将装…