【落羽的落羽 数据结构篇】顺序表
文章目录
- 一、线性表
- 二、顺序表
- 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篇文章,今天讲讲如何编写AI编程的提示词,并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是:目标清晰明确,具有针对性,能引导模型理解问题 下面是两条提示词的对…...

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?
近年来,人工智能(AI)领域发展迅猛,大语言模型(LLMs)为通用人工智能(AGI)的发展开辟了道路。OpenAI 的 o1 模型表现非凡,它引入的创新性推理时缩放技术显著提升了推理能力…...
高阶C语言|深入理解字符串函数和内存函数
文章目录 前言1.求字符串长度1.1 字符串长度函数:strlen模拟实现 2.长度不受限制的字符串函数2.1 字符串拷贝函数:strcpy模拟实现 2.2 字符串连接函数:strcat模拟实现 2.3 字符串比较函数:strcmp模拟实现 3.长度受限制的字符串函数…...
UE学习日志#17 C++笔记#3 基础复习3
19.2 [[maybe_unused]] 禁止编译器在未使用某些内容时发出警告 19.3 [[noreturn]] 永远不会把控制权返回给调用点 19.4 [[deprecated]] 标记为已弃用,仍然可以使用但是不鼓励使用 可以加参数表示弃用的原因[[deprecated("")]] 19.5 [[likely]]和[[un…...

团体程序设计天梯赛-练习集——L1-028 判断素数
前言 一道10分的题目,相对来说比较简单,思考的时候要仔细且活跃,有时候在写代码的时候一些代码的出现很多余,并且会影响最后的结果 L1-028 判断素数 本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)
目录 基础图形库的抽象 抽象图形 抽象点 设计我们的抽象 实现我们的抽象 测试 抽象线 设计我们的抽象 实现我们的抽象 绘制垂直的和水平的线 使用Bresenham算法完成任意斜率的绘制 绘制三角形和矩形 矩形 三角形 实现 绘制圆,圆弧和椭圆 继续我们的…...

创新创业计划书|建筑垃圾资源化回收
目录 第1部分 公司概况........................................................................ 1 第2部分 产品/服务...................................................................... 3 第3部分 研究与开发.................................................…...

反射、枚举以及lambda表达式
一.反射 1.概念:Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么&am…...

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

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

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

每日一博 - 三高系统架构设计:高性能、高并发、高可用性解析
文章目录 引言一、高性能篇1.1 高性能的核心意义 1.2 影响系统性能的因素1.3 高性能优化方法论1.3.1 读优化:缓存与数据库的结合1.3.2 写优化:异步化处理 1.4 高性能优化实践1.4.1 本地缓存 vs 分布式缓存1.4.2 数据库优化 二、高并发篇2.1 高并发的核心…...
C++ 中的引用(Reference)
在 C 中,引用(Reference)是一种特殊的变量类型,它提供了一个已存在变量的别名。引用在很多场景下都非常有用,比如函数参数传递、返回值等。下面将详细介绍 C 引用的相关知识。 1. 引用的基本概念和语法 引用是已存在…...
负荷预测算法模型
1. 时间序列分析方法 时间序列分析方法是最早被用来进行电力负荷预测的方法之一,它基于历史数据来构建数学模型,以描述时间与负荷值之间的关系。这种方法通常只考虑时间变量,不需要大量的输入数据,因此计算速度快。然而ÿ…...
【C语言】内存管理
【C语言】内存管理 文章目录 【C语言】内存管理1.概念2.库函数3.动态分配内存malloccalloc 4.重新调整内存的大小和释放内存reallocfree 1.概念 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在 C 语言中,内存是通过…...

deepseek大模型本机部署
2024年1月20日晚,中国DeepSeek发布了最新推理模型DeepSeek-R1,引发广泛关注。这款模型不仅在性能上与OpenAI的GPT-4相媲美,更以开源和创新训练方法,为AI发展带来了新的可能性。 本文讲解如何在本地部署deepseek r1模型。deepseek官…...
动态规划DP 最长上升子序列模型 拦截导弹(题目分析+C++完整代码)
概览检索 动态规划DP 最长上升子序列模型 拦截导弹 原题链接 AcWiing 1010. 拦截导弹 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每…...
缩位求和——蓝桥杯
1.题目描述 在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。 比如:248153720248153720 把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是 1 位数,得 24814>145 156 56 而…...

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

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...