顺序表的实现(迈入数据结构的大门)(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将会在接下来揭晓如何编写!!!

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

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

相关文章

线性表--数据结构设计与操作

单链表 1.单链表的定义&#xff1a; typedef struct LNode{Elemtype data;struct Lnode *next; }LNode ,*LinkList;//单链表的数据结构&#xff08;手写&#xff09; #include<iostream> #include<vector> #include<algorithm>typedef int TypeElem; //单链表…

OpenAI API搭建的智能家居助手;私密大型语言模型(LLM)聊天机器人;视频和音频文件的自动化识别和翻译工具

✨ 1: GPT Home 基于Raspberry Pi和OpenAI API搭建的智能家居助手 GPT Home是一个基于Raspberry Pi和OpenAI API搭建的智能家居助手&#xff0c;功能上类似于Google Nest Hub或Amazon Alexa。通过详细的设置指南和配件列表&#xff0c;用户可以自行组装和配置这个设备&#x…

Ansible自动运维工具之playbook

一.inventory主机清单 1.定义 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 2.变量 &#xff08;1&#xff09;主机变量 [webservers] 192.168.10.14 ansible_port22 ansible_userroot ans…

使用sqlmodel实现唯一性校验

代码&#xff1a; from sqlmodel import Field, Session, SQLModel, create_engine# 声明模型 class User(SQLModel, tableTrue):id: int | None Field(defaultNone, primary_keyTrue)# 不能为空&#xff0c;必须唯一name: str Field(nullableFalse, uniqueTrue)age: int | …

Flutter弹窗链-顺序弹出对话框

效果 前言 弹窗的顺序执行在App中是一个比较常见的应用场景。比如进入App首页&#xff0c;一系列的弹窗就会弹出。如果不做处理就会导致弹窗堆积的全部弹出&#xff0c;严重影响用户体验。 如果多个弹窗中又有判断逻辑&#xff0c;根据点击后需要弹出另一个弹窗&#xff0c;这…

大数据Scala教程从入门到精通第五篇:Scala环境搭建

一&#xff1a;安装步骤 1&#xff1a;scala安装 1&#xff1a;首先确保 JDK1.8 安装成功: 2&#xff1a;下载对应的 Scala 安装文件 scala-2.12.11.zip 3&#xff1a;解压 scala-2.12.11.zip 4&#xff1a;配置 Scala 的环境变量 在Windows上安装Scala_windows安装scala…

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第1节 (Weak 和 Unsafe 类型接口引用)

11.1.4 Weak 和 Unsafe 类型接口引用 ​ 从 Delphi 10.1 Berlin 开始&#xff0c;Object Pascal 语言对接口引用的管理进行了优化。实际上&#xff0c;Object Pascal 语言提供了不同类型的引用&#xff1a; 常规引用在分配和释放时分别递增和递减对象引用计数&#xff0c;最终…

控制元素隐藏

一、隐藏元素 在CSS中&#xff0c;有几种方法可以隐藏元素&#xff0c;每种方法都有其特定的用例和效果。以下是一些常用的CSS属性和技巧&#xff0c;用于隐藏元素&#xff1a; display: none; 这是最常用的隐藏元素的方法。它会将元素完全从文档流中移除&#xff0c;元素不会…

docker搭建代码审计平台sonarqube

docker搭建代码审计平台sonarqube 一、代码审计关注的质量指标二、静态分析技术分类三、sonarqube流程四、快速搭建sonarqube五、sonarqube scanner的安装和使用 一、代码审计关注的质量指标 代码坏味道 代码规范技术债评估 bug和漏洞代码重复度单测与集成 测试用例数量覆盖率…

node报错——解决Error: error:0308010C:digital envelope routines::unsupported——亲测可用

今天在打包vue2项目时&#xff0c;遇到一个报错&#xff1a; 最关键的代码如下&#xff1a; Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:80:19)百度后发现是node版本的问题。 在昨天我确实操作了一下node&…

Ansible——Playbook剧本

目录 一、Playbook概述 1.Playbook定义 2.Playbook组成 3.Playbook配置文件详解 4.运行Playbook 4.1Ansible-Playbook相关命令 4.2运行Playbook启动httpd服务 4.3变量的定义和引用 4.4指定远程主机sudo切换用户 4.5When——条件判断 4.6迭代 4.6.1创建文件夹 4.6.2…

[Linux][网络][TCP][四][流量控制][拥塞控制]详细讲解

目录 1.流量控制2.拥塞控制0.为什么要有拥塞控制&#xff0c;不是有流量控制么&#xff1f;1.什么是拥塞窗口&#xff1f;和发送窗口有什么关系呢&#xff1f;2.怎么知道当前网络是否出现了拥塞呢&#xff1f;3.拥塞控制有哪些算法&#xff1f;4.慢启动5.拥塞避免6.拥塞发生7.快…

劝退计算机?CS再过几年会没落!?

事实上&#xff0c;未来计算机不仅不会没落&#xff0c;国家还会大力发展 只不过大家认为的计算机就是什么Java web&#xff0c;真正的计算机行业是老美那样的&#xff0c;涉及到方方面面&#xff0c;比如&#xff1a; web&#xff0c;图形学&#xff0c;Linux系统开发&#…

pip 安装插件加速技巧: 修改为国内源

在国内&#xff0c;用 pip 安装 python 依赖包的时候&#xff0c;总是会遇到 Timeout 或者下载太慢的问题。 这是因为 pip 源在国外&#xff0c;解决方法就是把 pip 源改成国内的&#xff0c;就可以实现 pip install 加速。 1. 国内有哪些 pip 源&#xff1f; 国内有几个名气比…

2024DCIC海上风电出力预测Top方案 + 光伏发电出力高分方案学习记录

海上风电出力预测 赛题数据 海上风电出力预测的用电数据分为训练组和测试组两大类&#xff0c;主要包括风电场基本信息、气象变量数据和实际功率数据三个部分。风电场基本信息主要是各风电场的装机容量等信息&#xff1b;气象变量数据是从2022年1月到2024年1月份&#xff0c;…

Skywalking数据持久化与自定义链路追踪

学习本篇文章之前首先要了解一下Sky walking的基础知识 分布式链路追踪工具Skywalking详解 一&#xff0c;Sky walking数据持久化 Sky walking提供了es&#xff0c;MySQL等数据持久化方案&#xff0c;默认使用h2基于内存的数据库&#xff0c;重启之后数据即会丢失。 在实际工…

ORM框架在Java、Python、PHP中与MySQL的交互及优缺点比较

在现代软件开发中&#xff0c;对象关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;框架已经成为连接应用程序与数据库的重要工具。ORM框架通过提供一组方法&#xff0c;将数据库中的表与应用程序中的对象进行映射&#xff0c;从而简化了数据访问…

博客园商业化之路-众包平台:从第一单看基于「开发任务」的定位

虽然我们一再强调我们做的是「开发任务」众包平台&#xff0c;还是被不少人误解为「项目」众包平台&#xff0c;正好我们遇到的第一单就是一个典型案例&#xff0c;简单发篇博文分享一下。 4月29日我们开始召集众包平台的早期合作开发者&#xff0c;先以手动挡方式&#xff08…

微信小程序下载文件详解

在微信小程序中&#xff0c;下载文件通常涉及使用 wx.downloadFile API。这个 API 可以将网络资源下载到本地临时文件路径&#xff0c;然后你可以使用 wx.saveFile 将临时文件保存到本地持久存储位置。下面是一个下载文件的详细过程&#xff1a; 使用 wx.downloadFile 下载文件…

【Git】Git学习-16:git merge,且解决合并冲突

学习视频链接&#xff1a; 【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 1 创建分支dev&#xff0c;并用merge合并master分支&#xff0c;使dev分支合并上master分支中内容为…