顺序表(第二节)实现和解析
目录
1.顺序表中的头文件 (每一种函数方法)
2.关于typedef 的用法
3.初始化和销毁表
3.1初始化表
3.2销毁表
4.打印表
5.自动扩容表!!!(重点)
6.头部插入表和尾部插入表
6.1尾部插入表
6.2头部插入表
7.头部删除表和尾部删除表
7.1判断表是否为空
7.2尾部删除表
7.3头部删除表
8. 指定位置的插入和删除
8.1指定位置的插入
8.2指定位置的删除
大家有什么不懂的可以私信问我,我也是刚学会!!
1.顺序表中的头文件 (每一种函数方法)
#define INIT_CAPACITY 4
typedef int SLDataType;
// 动态顺序表 -- 按需申请
typedef struct SeqList
{SLDataType* a;int size; // 有效数据个数int capacity; // 空间容量
}SL;
//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);
//扩容
void SLCheckCapacity(SL* ps);
//头部插⼊删除 / 尾部插⼊删除
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
//指定位置之前插⼊/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
我的讲述方法是对这几行代码一一进行讲解,建议复制一份在VS中,边看博客边看头文件,不然真的看不懂。
2.关于typedef 的用法
1.typedef用来给类型重命名,这里为什么要把int 重命名改为SLDataType呢?
因为如果用int的话后续的代码如果要更改,那就得把全部的int 都更改,如果提前typedef了就可以直接改 上面的类型就好了
2.下面把struct SeqList 改为SL仅仅是因为前面那一串太长了,给他缩短一点,增加代码的可读性
3.初始化和销毁表
3.1初始化表
初始化表,用于初始化变量。变量的使用前都是要初始化的。
a的指针的意思是指向 要填充的变量
capacity的意思是目前开辟的内存的量,size表示现在被占用的内存的量
void SLInit(SL* ps)
{ps->a = NULL;ps->capacity = ps->size = 0;
}
3.2销毁表
判断ps->a的原因是,判断这个指针是不是为空,如果为空,会不执行任何操作直接返回。
然后再给ps a 置空,capacity和size 置为0;
void SLDestory(SL* ps)
{if (ps->a){free(ps->a);}ps->a = NULL;ps->capacity = ps->size = 0;
}
4.打印表
打印表很简单,就用for循环遍历 realloc开辟的空间就好了(在下一部分自动扩容表讲解)
注意打印结束后换行,避免下次打印连在一起。
ps->a[ i ] 的意思就和数组一样。用来表示每一块开辟空间里的存储的值。
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}
5.自动扩容表!!!(重点)
1. 首先扩容表的前提是,你的capacity(现在总共开辟的内存量)和size(已有数据的内存)这两个变量已经相等,说明这时候的内存已经不够了,需要添加。
2.所以判断语句是 ps capacity == ps size(这里不写箭头了)。
3.看到下面的int newcapacity 其实是用来判断 ps->capacity是否为0.如果为0则就直接等于4
不等于就等于 2 * ps->capacity, (0 ?4 :2*ps capacity就是判断是否为0,真就为前,假就为后)。
4.为什么要判断是否为0呢?因为如果为0,你下面开辟的代码 realloc开辟出来的空间还是0
5.之和在判断是否为NULL开辟失败的情况。
6.最后将开辟的空间 再次赋予 ps a。
7.ps capacity = newcapacity。
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){/*if (ps->capacity == 0) 判断capacity的情况,和下面newcapacity意思相同{ps->capacity == 4;}else{ps->capacity == ps->capacity * 2;}*/int newCapacity = ps->capacity == 0 ? 4 : 2*ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newCapacity);if (tmp == NULL){perror("realloc失败\n");return;}ps->a = tmp;ps->capacity = newCapacity;}
}
6.头部插入表和尾部插入表
6.1尾部插入表
很简单,1.首先需要断言 ps 是否为空 NULL,因为为空指针,进行解引用的时候会变成野指针。所以要保证传进来的指针不为空。
2.给一个上面的自动扩容表的函数,用来判断空间是否足够。
3.如果足够 则将 ps size 这个空间的位置赋值为x 。(因为是数组,所以第一个数的下标是0.所以ps size 表示被占用的空间数量,比如说有三个空间被占用,ps size =3,而被占空间的下标是0 1 2,所以3这个空间是没数值的,直接赋值即可。)
4.记得每次插入表给一个size ++;
void SLPushBack(SL* ps,SLDataType x)
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}
6.2头部插入表
一样的先断言看看ps是否为空。
1.与尾部插入不同的点就是,在头部插入,怎么在头部插入呢?
可以用for循环从后往前遍历一遍,将每一个数值都往后移一个内存。
2.然后再将 0 下标位置的内存赋值为 x。
3.插入表一定要size++
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->size++;
}
7.头部删除表和尾部删除表
7.1判断表是否为空
为什么要进行多一步判断表为空?
可以想象如果一个表都为空了,那它还删除什么?那肯定报错啊
所以在进行删除表的时候要进行判断表的有无。
bool 表达式只有两个值 真就是为true 为1,假就是 false 为0.
所以return的值要是一个表达式,用来判断是否为真或假。
bool SLIsEmpty(SL* ps)
{assert(ps);return ps->size == 0;
}
7.2尾部删除表
超简单的删除尾表。
1.一样的判断ps是否为空
2.判断表是否为空
3.对于一个开辟的表的内存,如果size--就说明有数据的空间-1. 下次在插入表数据的时候,直接使用这个空间,这样就是类似一个抽象的删除,因为下次添加数据还是用的这块内存,所以你不用给这块空间的数据清空也可以使用。
可以想象一个二手汽车,前一个拥有人想把它卖了,这时候这车就是无主车,等下一个车主来了,直接把前一个车主的名字改为下一个车主的名字即可。
void SLPopBack(SL* ps)
{assert(ps);assert(!(SLIsEmpty(ps)));ps->size--;
}
(!SLIsEmpty( ps )) 这个表达式的意思就是 上面用bool函数判断 表中有没有数据,
如果表中没有数据 就返回了一个1 ,用!来取反 所以这里就是 如果为1则断言程序终止。
如果为0就说明 有数据 程序继续进行。
7.3头部删除表
1.首先还是判断ps是否为空,和表是否为空
2.用for循环遍历把后一个的值赋予前一个。
为什么是 i < ps size - 1.因为我们只要有数据的空间,如果是 ps size不减一 那就会把 有一个空着的数据传到 最后一个位置。这是不需要的,因为是删除表,最后一个位置要被放弃的。
3.删除表 要 ps size --
void SLPopFront(SL* ps)
{assert(ps);assert(!(SLIsEmpty(ps)));for (int i = 0; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
8. 指定位置的插入和删除
8.1指定位置的插入
1.首先判断 ps 是否为空,判断 pos 是否超出表的范围。
2.因为是插入表所以要判断空间是否足够
3.用for循环 从后往前遍历 将前一个的数值赋值给后一个
为什么是 i = ps size -1,因为 ps size 的值 是表示 有数据的空间个数,而对于空间的下标来说,ps size 这个数字的空间下表指向的反而是下一个无数据的空间。我们看第一组的转换
ps a【i + 1】= ps a【i】如果把i 换了 就变成了ps a 【ps size】 = ps a 【ps size -1】。
这样就很好理解了,把下一个空数据的内存赋值为 最后一个内存的值。
pos -1,和上面类似,可以自己思考一下。(不懂可以私聊我,看到必回)
4.最后在pos 那个位置插入数据 x
5.插入表 ps size++
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size - 1; i > pos - 1; i--){ps->a[i + 1] = ps->a[i];}ps->a[pos] = x;ps->size++;
}
8.2指定位置的删除
1.因为是删除首先判断 ps 是否为空 表是否为空,在判断 要查找的数字是否在表数据的范围内。
2.这个删除和上面类似,就是要把前一个数据的值改为下一个数据的值即可,从pos的位置开始,因为要把pos位置的值给占领了。
3.ps size--
void SLErase(SL* ps, int pos)
{assert(ps);assert(!SLIsEmpty(ps));assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
大家有什么不懂的可以私信问我,我也是刚学会!!
相关文章:
顺序表(第二节)实现和解析
目录 1.顺序表中的头文件 (每一种函数方法) 2.关于typedef 的用法 3.初始化和销毁表 3.1初始化表 3.2销毁表 4.打印表 5.自动扩容表!!!(重点) 6.头部插入表和尾部插入表 6.1尾部插入表 …...
Hadoop3教程(二十一):MapReduce中的压缩
文章目录 (123)压缩概述在Map阶段启用在Reduce阶段启用 (124)压缩案例实操如何在Map输出端启用压缩如何在Reduce端启用压缩 参考文献 (123)压缩概述 压缩也是MR中比较重要的一环,其可以应用于M…...
04、RocketMQ -- 核心基础使用
目录 核心基础使用1、入门案例生产者消费者 2、消息发送方式方式1:同步消息方式2:异步消息方式3:一次性消息管控台使用过程中可能出现的问题 3、消息消费方式集群模式(默认)广播模式 4、顺序消息分析图:代码…...
mysql中date/datetime类型自动转go的时间类型time.Time
在DSN中需要加入parseTimetrue&&locLocal,或 charsetutf8mb4&locAsia%2FShanghai&parseTimetrue。 package main_testimport ("database/sql""fmt""testing""time"_ "github.com/go-sql-driver/mysq…...
MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)
目录 前言 几个高频面试题目 如何选择合适的面扫相机 如何选择光学滤波器 知识储备...
LDAP协议工作原理
LDAP,全称Lightweight Directory Access Protocol,译为轻量目录访问协议,是一个在互联网中广泛使用的协议,主要用于实现网络中的信息查找和检索。在身份认证方面,LDAP起着重要的作用。 LDAP的工作原理主要包括以下几个…...
【Jetpack Compose】BOM是什么?
前言 本篇旨在帮助小伙伴们了解和使用Compose中BOM相关的知识,在Compose的开发过程中更加便捷、统一的管理相关依赖信息。 BOM基础知识 Compose推出的BOM为物料清单的意思,BOM全称为Bill Of Materials,Compose推出BOM的意义旨在通过指定的…...
多域名SSL数字证书是什么呢
多域名SSL数字证书是众多SSL数字证书中最灵活的一款SSL证书产品。一般一张SSL证书只能保护一个域名,即使能保护多个域名站点,证书保护的域名类型也有限制(通配符SSL数字证书)。多域名SSL数字证书既能用一张SSL证书保护多个域名网站,又不限制域…...
杭电oj--求奇数的乘积
Problem Description 给你n个整数,求他们中所有奇数的乘积。 Input 输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存…...
E053-web安全应用-Brute force暴力破解初级
课程分类: web安全应用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请,对该公司旗下的网站进行安全检测,经过一番检查发现该论坛的后台登录页面上可能存在万能密码漏洞,导致不知道账号密码也能登录后台&am…...
外汇天眼;VT Markets 赞助玛莎拉蒂MSG Racing电动方程式世界锦标赛
随着国际汽联电动方程式世界锦标赛第十赛季的到来,外汇经纪商 VT Markets 和玛莎拉蒂 MSG Racing 宣布了一项为期多年的全球合作。 外汇天眼温馨提醒:在做外汇交易之前,一定要审核清楚外汇平台的资质以及官网信息,以防上当受骗&am…...
使用vscode + vite + vue3+ element3 搭建vue3脚手架
技术栈 开发工具:VSCode 代码管理:Git 前端框架:Vue3 构建工具:Vite 路由:vue-router 状态管理:vuex AJAX:axios UI库:element-ui 3 数据模拟:mockjs css预处理…...
竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…...
spring boot 下载resources下的静态文件为流格式
废话不多说,直接上代码 一、下载逻辑 public void downAppApk(HttpServletResponse response){ClassPathResource classPathResource new ClassPathResource("app/xxxxxx.apk");if (!classPathResource.exists()) {throw new BusinessException("安…...
HTML渲染过程
整个渲染过程: 将 URL 对应的各种资源,通过浏览器渲染引擎的解析,输出可视化的图像。 基本概念: HTML 解释器:解析html语言、将html文本翻译成dom树; CSS 解释器:解析css语言,给…...
[已解决]llegal target for variable annotation
llegal target for variable annotation 问题 变量注释的非法目标 思路 复制时编码错误,自己敲一遍后正常运行 #** 将垂直知识加入prompt,以使其准确回答 **# prompt_templates { # "recommand":"用户说:__INPUT__ …...
nodejs基于vue小型企业银行账目管理系统
这就产生了以台式计算机为核心的管理信息系统在大规模的事务处理和对工作流的管理等方面的应用,在银行帐目管理之中的应用日益增加 且会出现信息的重复传递问题,因此该过程需要进行信息化,以利用计算机进行帐目管理。 3.1 银行帐目管理系统功能模块 …...
pointnet和pointnet++点云分割和分类
目录 1. pointnet 1.1 点云数据的特点 1.2 模型功能 1.3 网络结构 1.3.1 分类网络 1.3.2 分割网络 2. pointnet 2.1 模型 2.2 sampling layer组件 2.3 grouping layer 2.4 pointnet 1. pointnet 1.1 点云数据的特点 (1)无序性:…...
Docker-compose和Consul
目录 1、docker-compose 简介 1.1 Docker-compose 简介 2、compose 部署 2.1 Docker Compose 环境安装 2.2 YAML 文件格式及编写注意事项 * * * * 2.3 Docker Compose配置常用字段 2.4 Docker Compose 常用命令 2.5 Docker Compose 文件结构 3、Consul 3.1 什么是…...
AFL模糊测试+GCOV覆盖率分析
安全之安全(security)博客目录导读 覆盖率分析汇总 目录 一、代码示例 二、afl-cov工具下载 三、编译带覆盖率的版本并启动afl-cov 四、AFL编译插桩并运行afl-fuzz 五、结果查看 AFL相关详见AFL安全漏洞挖掘 GCOV相关详见GCOV覆盖率分析 现将两者结合,即进…...
当流程图XML“损坏”时:手把手教你用Activiti API解析与修复BPMN文件
当BPMN文件遭遇“数据灾难”:Activiti深度修复实战指南 凌晨三点,服务器警报突然响起——核心业务流程引擎拒绝加载最新上传的BPMN文件。这不是简单的格式错误,而是一个从老旧系统迁移来的、经过多次手工编辑的流程定义文件。作为技术负责人&…...
揭秘Intel DCI与System Debugger:深入追踪CSME/BIOS在主机启动中的关键信息流
1. 认识Intel DCI与System Debugger 如果你曾经遇到过电脑开机卡在Logo界面、反复重启或者直接黑屏的情况,作为工程师的你一定想知道:到底哪里出了问题?这时候,Intel DCI(Direct Connect Interface)和Syste…...
YOLOv8推理性能跃迁:从CPU到GPU的实战迁移指南
1. 为什么要把YOLOv8推理从CPU迁移到GPU? 第一次用YOLOv8做目标检测时,我盯着屏幕上蜗牛般的推理速度差点崩溃——一张1080P的图片要处理3秒!直到把环境切换到GPU,速度直接飙升到30帧/秒,这种性能飞跃让我彻底明白了硬…...
独立开发者如何借助Taotoken的Token Plan降低AI应用长期运行成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken的Token Plan降低AI应用长期运行成本 对于独立开发者和小型团队而言,构建AI应用时…...
安达发|aps软件系统:塑料薄膜业数字化升级,破生产管理难题
安达发APS高级生产计划智能排产排程自动排单软件系统推荐_MES 在包装、农业、电子、医疗等产业高速发展的带动下,我国塑料薄膜行业市场规模持续扩张,行业竞争从单纯的产能比拼转向精细化、智能化管理竞争。当前塑料薄膜企业普遍面临多品种、小批量、定制…...
LabVIEW 32位版如何调用Halcon 17.12的.NET库?手把手教你打通图像处理流程
LabVIEW 32位版与Halcon 17.12 .NET库深度兼容指南:从原理到实战 在工业视觉和自动化测试领域,LabVIEW与Halcon的组合堪称黄金搭档。但当我们试图在32位LabVIEW环境中调用Halcon 17.12的.NET库时,常常会遇到各种"拦路虎"——从神秘…...
Midjourney年度订阅稀缺性验证:全球仅开放17.3%账户享受$99档位(基于2024年Q3后台错误码403-ENTITLEMENT统计)
更多请点击: https://codechina.net 第一章:Midjourney年度订阅稀缺性现象的实证发现 近期对Midjourney官方订阅渠道的持续监测(2023年10月–2024年3月)揭示了一种显著且可复现的市场行为模式:年度订阅选项在多数时段…...
告别开机黑屏:搞懂UEFI、CSM和Secure Boot的‘三角关系’,装机不求人
现代计算机启动架构解密:UEFI、CSM与Secure Boot的协同与冲突 开机黑屏是许多DIY装机用户和技术爱好者常遇到的棘手问题。当新硬件遇上旧设备,或是现代系统需要兼容传统软件时,计算机的启动过程往往成为第一道技术壁垒。要真正理解这些兼容性…...
利用Taotoken模型广场为不同任务场景选择合适的大模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken模型广场为不同任务场景选择合适的大模型 当你的项目需要处理多种类型的任务时,例如同时涉及内容创作、代…...
如何在macOS上轻松运行Windows应用:Whisky终极指南
如何在macOS上轻松运行Windows应用:Whisky终极指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 想在苹果电脑上使用Windows专属的软件和游戏吗?厌倦了虚拟…...
