顺序表的实现(迈入数据结构的大门)(1)
上一节我们认识到了什么是数据结构
这一节我们就来实现第一个数据结构的实现
思考一个问题:
假定一个数组,空间为10,已经使用了5个,向其中插入数据的步骤:
1.插入数据,我们先要求数组长度,其中有效数据的个数,判断空余空间的大小,向下标中放入有效数据;(这里需要判断数组是否太满了,剩余空间是否还足够);
2.如果数据量庞大,我们就要频繁获取数组有限个数,就会影响程序运行速率;
这时候我们就要利用其余数据结构(顺序表、链表、二叉树;更甚至红黑树、B树等更为高级的数据结构);
那我们就进入,顺序表的学习吧;
顺序表
顺序表是一种线性表
线性表(List):零个或多个数据元素的有限序列。线性表的数据集合为{a1,a2,…,an},假设每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。在较复杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件

顺序表(对数组的封装)的分类
静态顺序表
顾名思义:即是使用定长数组来储存元素
typedef int SLdataTapy;
#define N 10 //数组的大小由N决定typedef struct seqlist {SLdataTapy arr[N];//定长数组int size;//有效数组个数
}SL;
注意:这就会出现:空间小了不够用,空间大了,空间浪费。
想一想呢,根据之前的学习,是什么可以动态增删内存呢
没错,就是利用malloc、relloc、calloc内存函数了
(忘记的小朋友可以回顾一下往期的博客,动态内存的管理(内存储存的god)-CSDN博客)
动态顺序表
typedef int SLdataTapy;typedef struct seqlist {SLdataTapy* a;//用来开辟动态内存int size;//有效数组个数int capacity;//剩余容量;判断是否需要新添加内存
}SL;
顺序表的实现
#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);
int SLFind(SL* ps, SLDataType x);
以上则是我们需要实现顺序表的作用
顺序表的初始化
将其中的数组置为NULL;其余置为0;
void SLInit(SL* ps) {ps->a = NULL;//置为NULL,以防野指针的出现ps->size = ps->capacity = 0;
}
有初始化就有销毁
销毁则是需要将数组重新置为NULL;其余置为0;
void SLDestroy(SL* ps) {if (ps->a) {//判断数组中是否为空free(ps->a);//因为动态顺序表需要使用malloc开辟内存,所以需要注意释放内存}ps->a = NULL;ps->size = ps->capacity = 0;
}
当我们设置好一切后,就要对数组进行扩容
//扩容
void SLCheckCapacity(SL* ps) {//先要判断内存够不够if (ps->size == ps->capacity) {//使用malloc relloc cellocint newcappacity = ps->capacity * 2;//一般增容原来内存的二到三倍;SLDataType*tmp = (SLDataType*)relloc(ps->a,newcappacity * sizeof(SLDataType));//注:这里没有直接使用ps->a直接申请,是为了防止内存申请失败;防止数据丢失if (tmp == NULL) {//也可以使用assert直接终止程序;需要使用aseert.h的头文件perror("relloc fail");exit(1);//直接退出程序;也可使用return;}//空间增容成功ps->a = tmp;ps->capacity = newcappacity;}
}
其中出现了一点小问题,是否发现了呢;
果然聪明的你一眼就发现问题了呢;
int newcappacity = ps->capacity * 2;//一般增容原来内存的二到三倍;
SLDataType*tmp = (SLDataType*)relloc(ps->a,newcappacity * sizeof(SLDataType));
在使用这句的前提是capacity为0;就会导致开辟为0的空间,就会出现错误;
就可以利用到三目操作符,使其完成扩容:如以下代码
int newcappacity = ps->capacity == 0 ? 4 :ps->capacity*2
ps->capacity是否为0;如果是则为4;否则乘以2;
我们已经完成了初始化,销毁与扩容,你可以尝试剩余代码的编写;
点关注,不迷路,up将会在接下来揭晓如何编写!!!
相关文章:
顺序表的实现(迈入数据结构的大门)(1)
上一节我们认识到了什么是数据结构 这一节我们就来实现第一个数据结构的实现 思考一个问题: 假定一个数组,空间为10,已经使用了5个,向其中插入数据的步骤: 1.插入数据,我们先要求数组长度,其…...
RERCS系统-WDA+BOPF框架实战例子 PART 1-新建List UIBB(列表组件)并分配Feeder Class和Node Element
需求背景: 已有的项目主数据功能,新增一个列表UIBB显示主数据额外的关联数据明细。 1、Fiori页面通过右键-技术帮助打开对应的组件配置; 2、双击对应的组件配置,调整对应的页面新建UIBB; 3、填写对应的UIBB属性字段&a…...
如何从 iPhone 恢复已删除或丢失的联系人?
不小心删除了您的 iPhone 联系人?不用担心。我们将向您展示如何从 iPhone或 iPad恢复已删除或丢失的联系人。当您从 iPhone 中删除联系人时,您可能认为无法将其恢复。但事实是,您可以从 iPhone 或 iPad 恢复已删除的联系人,因为它…...
RISCV 外部GCC 工具链安装@FreeBSD15
在交叉编译的时候,可以使用FreeBSD15默认的工具链:LLVM 也可以使用GCC工具链,GCC可以使用现成pkg包安装,也可以编译安装。 LLVM的特点是高移植性和高效,但学习成本高。GCC的特点是成熟稳定,但优化能力有限…...
全栈开发之路——前端篇(9)插槽、常用api和全局api
全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…...
减瘦误区、雷点、陷阱和挑战怎么应对
在减瘦过程中,很多肥胖人群都容易踩到坑。比如陷入误区,认为只有短期快速的减调方式方法,才值得尝试,而忽视身体健康;或是踩到雷点,轻信强速方剂或方法,结果身体产生了排斥或根本没效用白花钱&a…...
Leetcode—946. 验证栈序列【中等】
2024每日刷题(133) Leetcode—946. 验证栈序列 实现代码 class Solution { public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {int left 0;for(int i 0; i < popped.size(); i) {while(left &…...
Selenium定位方法及代码
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
GitHub搭建免费博客
一、GitHub仓库准备 搭建博客需要准备两个仓库。一个存放博客图床的仓库,另一个存放博客网站的仓库。 1.1、图床创建 新建仓库 第一步: 第二步: 生成Token令牌 点击右上角头像->Settings->下拉,直到左侧到底&#…...
开源代码分享(28)-含分布式光伏的配电网集群划分和集群电压协调控制
参考文献: [1] Chai Y , Guo L , Wang C ,et al.Network Partition and Voltage Coordination Control for Distribution Networks With High Penetration of Distributed PV Units[J].IEEE Transactions on Power Systems, 2018:3396-3407.DOI:10.1109/TPWRS.2018…...
idea-自我快捷键-2
1. 书签 创建书签: 创建书签:F11创建特色标记书签:Ctrl F11快速添加助记符书签:ctrl shift 数字键 查看书签: shift F11快速定位到助记符书签:Ctrl 数字键 删除书签: delete 2. 自动…...
深入学习指针3
目录 前言 1.二级指针 2.指针数组 3.指针数组模拟二维数组 前言 Hello,小伙伴们我又来了,上期我们讲到了数组名的理解,指针与数组的关系等知识,那今天我们就继续深入到学习指针域数组的练联系,如果喜欢作者菌生产的内容还望不…...
礼赞劳动节,致敬劳动者。节日随想:疾笔耕耘也是一种劳动方式。
马克思也快诞辰了206年了,恩格斯领导的第二国际通过的决议节日也迎来了134岁的生日了,我也继续在劳动的路上。 五月是值得纪念的日子,作为一名无上光荣的分子,无比仰慕崇拜的两位先驱前辈大胡子,其一 生于斯࿰…...
学习Java的日子 Day45 HTML常用的标签
Day45 HTML 1.掌握常用的标签 1.1 标题标签 h1-h6 <h1>一级标签</h1> <h2>二级标签</h2> <h3>三级标签</h3> <h4>四级标签</h4> <h5>五级标签</h5> <h6>六级标签</h6> 显示特点: * 文字…...
兔子与狮子
兔子与狮子 一只骨瘦如柴的兔子,在慢悠悠地吃草 趴在边上的狮子说,多吃点吧,你身上一点肉都没有 兔子说,我正在减肥,体重越来越轻,骨头越来越硬 狮子舔了舔嘴巴,你再狡猾,也是我的…...
GNU/Linux - 系统启动流程及rcS脚本介绍
Linux系统启动流程 在 Linux 系统启动过程中,会按特定顺序执行多个脚本和初始化例程,以使系统进入可用状态。虽然具体顺序可能因 Linux 发行版和版本而异,但以下是典型执行顺序的概括性概述: 1. BIOS/UEFI: 系统开机后…...
对象,字符串的解构赋值
大家想了解更多,可以去看阮一峰的ECMAScript6(ES6)标准入门课程 对象 简介 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } { foo: aaa, bar: bbb }; foo // "aaa" bar // "bbb" 对象的解构与数组有一个重要的不同。…...
Django 静态文件管理与部署指南
title: Django 静态文件管理与部署指南 date: 2024/5/10 17:38:36 updated: 2024/5/10 17:38:36 categories: 后端开发 tags: WebOptCDN加速DjangoCompressWebpackStaticDeployCICD-ToolsSecStatic 第一章:介绍 Django 静态文件的概念和重要性 在 Web 开发中&a…...
ORACLE ODAX9-2的一个误告警Affects: /SYS/MB的分析处理
在运维的多套ORACLE ODAX9-2版本,都遇到了一个计算节点的告警:Description: The service Processor poweron selftest has deteced a problem. Probabity;:100, UulD:cd1ebbdf-f099-61de-ca44-ef646defe034, Resource:/SYS/MB,;此告警从描述上…...
Spring AOP浅谈
什么是AOP? AOP是Aspect-Oriented Programming的缩写,是一种面向切面的编程方法。 在AOP中,一个切面是一组可以独立于其他代码执行的功能,如日志记录、安全性检查、事务处理等。这些功能通常被称为"通知",并…...
3步搞定浏览器脚本:Greasy Fork小白也能懂的终极指南
3步搞定浏览器脚本:Greasy Fork小白也能懂的终极指南 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork 你是否厌倦了网页上烦人的广告?想要自动填充表单、一键下载视…...
为什么你的局域网速度慢?可能是集线器和交换机的区别没搞懂
为什么你的局域网速度慢?可能是集线器和交换机的区别没搞懂 家里或办公室的网络总是不给力?明明升级了宽带套餐,下载文件时却还是像蜗牛爬行?问题可能出在你忽略的网络设备选择上。许多用户至今仍在用早已淘汰的集线器(…...
IE浏览器已成过去式?Win10用户必看的IE性能优化与安全设置
IE浏览器性能优化与安全设置指南:告别卡顿与劫持困扰 微软宣布放弃IE浏览器已经过去多年,但这款"古董级"浏览器依然顽固地存在于我们的Windows系统中。对于许多企业用户和特定行业从业者来说,完全卸载IE并非可行选项——某些老旧的…...
【AI大模型】在线大语言模型实现与学习具身智能
目录 一、在线大语言模型的核心实现原理 (一)基础模型架构与预训练优化 (二)在线部署与实时交互模块 (三)持续学习与反馈优化模块 二、在线大语言模型学习具身智能的核心路径 (一ÿ…...
革命性KVM管理工具Kimchi:HTML5界面快速部署虚拟机完整指南
革命性KVM管理工具Kimchi:HTML5界面快速部署虚拟机完整指南 【免费下载链接】kimchi An HTML5 management interface for KVM guests 项目地址: https://gitcode.com/gh_mirrors/ki/kimchi 你是否还在为复杂的KVM虚拟机管理而烦恼?想要一个直观易…...
手搓LabVIEW声音采集系统——从调参到装X全攻略
Labview程序开发——声音采集系统 基于 Labview软件,以声卡为数据采集设备开发数据采集处理系统。 系统功能应包括: 1)声卡参数设置:包括设备ID号,采样模式,每通道采样点 数,采样率,通道数等参数设置; 2) 文件操作:实现…...
轻量级C++ HTTP库:cpp-httplib极速集成指南
轻量级C HTTP库:cpp-httplib极速集成指南 【免费下载链接】cpp-httplib A C header-only HTTP/HTTPS server and client library 项目地址: https://gitcode.com/GitHub_Trending/cp/cpp-httplib 核心价值:单文件驱动的开发效率革命 cpp-httplib…...
论文省心了!盘点2026年全网爆红的的降AI率平台
轻松降低论文AI率在2026年已不再是天方夜谭。2026年降AI率平台横空出世,实测提速效果炸裂,覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景,高效搞定毕业论文难题。 一、全流程王者:一站式搞定论文全链路 这类…...
SSE vs. WebSocket:实时通信技术的深度对比与选型指南
1. 实时通信技术的基本概念 现代Web应用对实时性的需求越来越高,从股票行情更新到在线聊天室,都需要服务器能够快速将数据推送到客户端。在这个领域,SSE(Server-Sent Events)和WebSocket是两种主流技术方案。我第一次接…...
Font-Awesome-SVG-PNG 核心原理:深入解析SVG到PNG的转换机制
Font-Awesome-SVG-PNG 核心原理:深入解析SVG到PNG的转换机制 【免费下载链接】Font-Awesome-SVG-PNG Font Awesome split to individual SVG and PNG files of different sizes along with Node.JS based generator 项目地址: https://gitcode.com/gh_mirrors/fo/…...
