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

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

在这里插入图片描述

文章目录

  • 一、线性表
  • 二、顺序表
    • 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 源文件中,每一个功能都封装成一个函数。测试顺序表功能则在test.c 中完成。(它们都要包含SeqList.h头文件)

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

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

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

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

相关文章:

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

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

AI编程:如何编写提示词

这是小卷对AI编程工具学习的第2篇文章&#xff0c;今天讲讲如何编写AI编程的提示词&#xff0c;并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是&#xff1a;目标清晰明确&#xff0c;具有针对性&#xff0c;能引导模型理解问题 下面是两条提示词的对…...

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域发展迅猛&#xff0c;大语言模型&#xff08;LLMs&#xff09;为通用人工智能&#xff08;AGI&#xff09;的发展开辟了道路。OpenAI 的 o1 模型表现非凡&#xff0c;它引入的创新性推理时缩放技术显著提升了推理能力…...

高阶C语言|深入理解字符串函数和内存函数

文章目录 前言1.求字符串长度1.1 字符串长度函数&#xff1a;strlen模拟实现 2.长度不受限制的字符串函数2.1 字符串拷贝函数&#xff1a;strcpy模拟实现 2.2 字符串连接函数&#xff1a;strcat模拟实现 2.3 字符串比较函数&#xff1a;strcmp模拟实现 3.长度受限制的字符串函数…...

UE学习日志#17 C++笔记#3 基础复习3

19.2 [[maybe_unused]] 禁止编译器在未使用某些内容时发出警告 19.3 [[noreturn]] 永远不会把控制权返回给调用点 19.4 [[deprecated]] 标记为已弃用&#xff0c;仍然可以使用但是不鼓励使用 可以加参数表示弃用的原因[[deprecated("")]] 19.5 [[likely]]和[[un…...

团体程序设计天梯赛-练习集——L1-028 判断素数

前言 一道10分的题目&#xff0c;相对来说比较简单&#xff0c;思考的时候要仔细且活跃&#xff0c;有时候在写代码的时候一些代码的出现很多余&#xff0c;并且会影响最后的结果 L1-028 判断素数 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)

目录 基础图形库的抽象 抽象图形 抽象点 设计我们的抽象 实现我们的抽象 测试 抽象线 设计我们的抽象 实现我们的抽象 绘制垂直的和水平的线 使用Bresenham算法完成任意斜率的绘制 绘制三角形和矩形 矩形 三角形 实现 绘制圆&#xff0c;圆弧和椭圆 继续我们的…...

创新创业计划书|建筑垃圾资源化回收

目录 第1部分 公司概况........................................................................ 1 第2部分 产品/服务...................................................................... 3 第3部分 研究与开发.................................................…...

反射、枚举以及lambda表达式

一.反射 1.概念&#xff1a;Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到那么&am…...

ROS应用之IMU碰撞检测与接触事件识别

前言 碰撞检测与接触事件识别是机器人与环境交互中的重要任务&#xff0c;尤其是在复杂的动态环境中。IMU&#xff08;惯性测量单元&#xff09;作为一种高频率、低延迟的传感器&#xff0c;因其能够检测加速度、角速度等动态变化而成为实现碰撞检测的核心手段之一。结合先进的…...

docker安装MySQL8:docker离线安装MySQL、docker在线安装MySQL、MySQL镜像下载、MySQL配置、MySQL命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull mysql:8.0.41 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜…...

android安卓用Rime

之前 [1] 在 iOS 配置用上自改方案 [2]&#xff0c;现想在安卓也用上。Rime 主页推荐了两个安卓平台支持 rime 的输入法 [3]&#xff1a; 同文 Tongwen Rime Input Method Editor&#xff0c;但在我的 Realme X2 Pro 上似乎有 bug&#xff1a;弹出的虚拟键盘只有几个 switcher…...

每日一博 - 三高系统架构设计:高性能、高并发、高可用性解析

文章目录 引言一、高性能篇1.1 高性能的核心意义 1.2 影响系统性能的因素1.3 高性能优化方法论1.3.1 读优化&#xff1a;缓存与数据库的结合1.3.2 写优化&#xff1a;异步化处理 1.4 高性能优化实践1.4.1 本地缓存 vs 分布式缓存1.4.2 数据库优化 二、高并发篇2.1 高并发的核心…...

C++ 中的引用(Reference)

在 C 中&#xff0c;引用&#xff08;Reference&#xff09;是一种特殊的变量类型&#xff0c;它提供了一个已存在变量的别名。引用在很多场景下都非常有用&#xff0c;比如函数参数传递、返回值等。下面将详细介绍 C 引用的相关知识。 1. 引用的基本概念和语法 引用是已存在…...

负荷预测算法模型

1. 时间序列分析方法 时间序列分析方法是最早被用来进行电力负荷预测的方法之一&#xff0c;它基于历史数据来构建数学模型&#xff0c;以描述时间与负荷值之间的关系。这种方法通常只考虑时间变量&#xff0c;不需要大量的输入数据&#xff0c;因此计算速度快。然而&#xff…...

【C语言】内存管理

【C语言】内存管理 文章目录 【C语言】内存管理1.概念2.库函数3.动态分配内存malloccalloc 4.重新调整内存的大小和释放内存reallocfree 1.概念 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在 C 语言中&#xff0c;内存是通过…...

deepseek大模型本机部署

2024年1月20日晚&#xff0c;中国DeepSeek发布了最新推理模型DeepSeek-R1&#xff0c;引发广泛关注。这款模型不仅在性能上与OpenAI的GPT-4相媲美&#xff0c;更以开源和创新训练方法&#xff0c;为AI发展带来了新的可能性。 本文讲解如何在本地部署deepseek r1模型。deepseek官…...

动态规划DP 最长上升子序列模型 拦截导弹(题目分析+C++完整代码)

概览检索 动态规划DP 最长上升子序列模型 拦截导弹 原题链接 AcWiing 1010. 拦截导弹 题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每…...

缩位求和——蓝桥杯

1.题目描述 在电子计算机普及以前&#xff0c;人们经常用一个粗略的方法来验算四则运算是否正确。 比如&#xff1a;248153720248153720 把乘数和被乘数分别逐位求和&#xff0c;如果是多位数再逐位求和&#xff0c;直到是 1 位数&#xff0c;得 24814>145 156 56 而…...

Baklib赋能企业实现高效数字化内容管理提升竞争力

内容概要 在数字经济的浪潮下&#xff0c;企业面临着前所未有的机遇与挑战。随着信息技术的迅猛发展&#xff0c;各行业都在加速推进数字化转型&#xff0c;以保持竞争力。在这个过程中&#xff0c;数字化内容管理成为不可或缺的一环。高效的内容管理不仅能够优化内部流程&…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...