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

数据结构(初阶)第二节:顺序表

数据结构(初阶)第一节:数据结构概论-CSDN博客

从本文正式进入对数据结构的讲解,开始前友友们要有C语言的基础,熟练掌握动态内存管理结构体指针等章节,方便后续的学习。

目录

顺序表(Sequence List)

顺序表的分类

静态顺序表

动态顺序表

顺序表的功能

初始化

扩容        

头插        

尾插 

头删 

尾删

销毁

打印顺序表

示例


顺序表(Sequence List)

线性表的概念线性表(linear list是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

        线性表是对存储具有某种共同点的数据集合的统称,顺序表和数组就是线性表的一种。顺序表的底层逻辑是利用数组实现的,但是相较于数组,顺序表的功能更齐全、丰富,顺序表新增了增、删、查、改等功能。

顺序表的分类

        根据定义格式的不同,顺序表又可分为静态顺序表动态顺序表

静态顺序表

#include <stdio.h>struct SeqList//定义顺序表
{int arr[10];//定长数组int size;//顺序表中有序的元素个数
};

静态顺序表的缺陷:空间给少了不够⽤,给多了造成空间浪费静态顺序表的定义方式已经基本被淘汰,现在大多采用动态顺序表的定义方式。

动态顺序表

        动态顺序表不同于静态顺序表,它很好的解决了空间浪费的问题,动态顺序在定义时不直接指明内存空间的大小(在初始化时有一定的空间),而是根据需求通过动态内存分配的方式开辟内存,等到存储空间不够时再扩容。

#include <stdio.h>typedef int SLDateType;typedef struct SeqList
{SLDateType* a;//动态数组int size;//有效元素个数int capacity;//已经开辟的空间大小
}SL;

在一开始定义时,使用typedef关键字对数据类型和结构体重命名,方便后续修改,比如说将存储int的数组改为存储char的数组,只需要将typedef int SLDateType中的int改为char即可,可以提高开发效率。

顺序表的功能

初始化

        在初始化时,我们选择malloc函数为数组分配内存,初始的内存空间一般定义为4个字节的大小。

注意:在对初始化函数传参时一定要传地址值,也就是参数一定是指针变量,不能直接将非指针变量传递过去,因为形参和实参不在同一块内存空间中,直接传参的话会导致初始化失败,程序报错。

void SLinit(SL* ps)
{ps->a = malloc((sizeof(SLDateType)) * 4);//初始内存4个字节if (ps->a == NULL)//分配内存失败{perror("malloc fail");return;}ps->capacity = 4;ps->size = 0;
}

扩容        

        在对顺序表进行扩容时应该首先判断该情况下是否需要扩容,即ps->capacity == ps->size,判断之后使用realloc函数进行扩容,每次扩容应为上一次的两倍。

void SLcheckCapcity(SL* ps)
{if (ps->capacity == ps->size)//判断是否需要扩容{SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * ps->capacity * 2);//一般每次扩容到上一次的2倍if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}

头插        

        在顺序表的头部插入一个元素,其余元素按顺序向后移动。

void SLpopFront(SL* ps, SLDateType x)
{assert(ps);SLcheckCapcity(ps);for (int i = ps->size; i >= 1; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->size++;
}

尾插 

        顺序表尾部插入元素,在尾部插入时就一定要进行数组扩容。通过调用SLpopBack函数在尾部插入元素,ps->size最开始指向0索引,每次插入元素时size总在最后一个有效元素的下一位。

void SLpopBack(SL* ps, SLDateType x)
{assert(ps);SLcheckCapcity(ps);ps->a[ps->size++] = x;
}

头删 

     从顺序表头部删除元素,将元素按顺序前移,覆盖要删除的元素。

void SLpushFront(SL* ps)
{assert(ps && ps->size);//当顺序表为空时不用删除元素for (int i = 1; i < ps->size; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}

尾删

void SLpushBack(SL* ps)
{assert(ps && ps->size);ps->size--;
}

销毁

void SLdestory(SL* ps)
{free(ps);ps->a = NULL;ps->capacity = 0;ps->size = 0;
}

打印顺序表

void SLprint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++)printf("%d ", ps->a[i]);printf("\n");
}

示例

int main()
{SL p;SLinit(&p);printf("这是尾插:");//尾插1 2 3 4 5SLpopBack(&p, 1);SLpopBack(&p, 2);SLpopBack(&p, 3);SLpopBack(&p, 4);SLpopBack(&p, 5);SLprint(&p);printf("这是头插:");//头插6 7 8SLpopFront(&p, 8);SLpopFront(&p, 7);SLpopFront(&p, 6);SLprint(&p);printf("这是头删:");//头删6 7 8SLpushFront(&p);SLpushFront(&p);SLpushFront(&p);SLprint(&p);printf("这是尾删:");//尾删3 4 5SLpushBack(&p);SLpushBack(&p);SLpushBack(&p);SLprint(&p);SLdestory(&p);return 0;
}

 运行结果:

相关文章:

数据结构(初阶)第二节:顺序表

数据结构&#xff08;初阶&#xff09;第一节&#xff1a;数据结构概论-CSDN博客 从本文正式进入对数据结构的讲解&#xff0c;开始前友友们要有C语言的基础&#xff0c;熟练掌握动态内存管理、结构体、指针等章节&#xff0c;方便后续的学习。 目录 顺序表&#xff08;Sequen…...

鸿蒙OS元服务开发:【(Stage模型)设置应用主窗口】

一、设置应用主窗口说明 在Stage模型下&#xff0c;应用主窗口由UIAbility创建并维护生命周期。在UIAbility的onWindowStageCreate回调中&#xff0c;通过WindowStage获取应用主窗口&#xff0c;即可对其进行属性设置等操作。还可以在应用配置文件中设置应用主窗口的属性&…...

lua学习笔记6(经典问题输出99乘法表)

print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字&#xff0c;用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…...

物联网行业中,我们如何选择数据库?

在当今数字化潮流中&#xff0c;我们面对的不仅是海量数据&#xff0c;更是时间的涟漪。从生产线的传感器到金融市场的交易记录&#xff0c;时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时&#xff0c;我们需要深入了解一种强大的工具——时序数…...

openstack云计算(一)————openstack安装教程,创建空白虚拟机,虚拟机的环境准备

1、创建空白虚拟机 需要注意的步骤会截图一下&#xff0c;其它的基本都是下一步&#xff0c;默认的即可 ----------------------------------------------------------- 2、在所建的空白虚拟机上安装CentOS 7操作系统 &#xff08;1&#xff09;、在安装CentOS 7的启动界面中…...

Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…...

Python yield解析:深入理解生成器的魔力

Python中的yield关键字是生成器函数中非常重要的一部分&#xff0c;它可以使函数暂停执行并保存当前状态&#xff0c;同时允许生成器函数返回一个值。本文将详细介绍yield关键字的用法、特性、基本功能、高级功能、实际应用场景以及总结&#xff0c;帮助深入了解yield关键字的作…...

【Linux】GCCGDB

五、GCC & GDB 5.1 gcc 阶段变化命令预处理hello.c->hello.igcc -E 编译hello.i->hello.sgcc -S 汇编hello.s->hello.ogcc -c 链接hello.o->a.outgcc gcc -E hello.c -o 1.i # -o指定输出文件 gcc -E hello.c -g # -g包含提示信息 gcc -D gcc -DDebug <…...

InternLM2-Chat-1.8B 模型测试

在interStudio进行InternLM2-Chat-1.8B模型访问&#xff0c;进入开发机后 配置基础环境 新建conda环境并且进入 conda create -n demo python3.10 -y conda activate demo 下载pytorch等相关包 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.…...

Flutter 关键字

import ‘package:xxxx.dart’; //源于pub.dev (完美的相对引入) import ‘xxxx.dart’; //自定义文件(库)(参考的相对引入(填写import命令码所在文件的上级文件夹下的文件(库)相对路径))(受到import命令码所在文件的参考路径的影响) import&#xff1a;import不具有传递性(类似…...

Java常用API之Collections类解读

写在开头&#xff1a;本文用于作者学习Java常用API 我将官方文档中Collections类中所有API全测了一遍并打印了结果&#xff0c;日拱一卒&#xff0c;常看常新 addAll() 将所有指定元素添加到指定 collection 中 可以添加一个或多个元素 Testpublic void test_addAl…...

KV260 BOOT.BIN更新 ubuntu22.04 netplan修改IP

KV260 2022.2设置 BOOT.BIN升级 KV260开发板需要先更新BOOT.BIN到2022.2版本&#xff0c;命令如下&#xff1a; sudo xmutil bootfw_update -i “BOOT-k26-starter-kit-202305_2022.2.bin” 注意BOOT.BIN应包含全目录。下面是更新到2022.1 FW的示例&#xff0c;非更新到2022.…...

Android 代码自定义drawble文件实现View圆角背景

简介 相信大多数Android开发都会遇到一个场景&#xff0c;给TextView或Button添加背景颜色&#xff0c;修改圆角&#xff0c;描边等需求。一看到这样的实现效果&#xff0c;自然就是创建drawble文件&#xff0c;设置相关属性shap&#xff0c;color&#xff0c;radius等。然后将…...

C#实现Word文档转Markdown格式(Doc、Docx、RTF、XML、WPS等)

文档格式的多样性丰富了我们的信息交流手段&#xff0c;其中Word文档因其强大的功能性而广受欢迎。然而&#xff0c;在网络分享、版本控制、代码阅读及编写等方面&#xff0c;Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势。将Word文档转换为Markdown格式&#xf…...

信息系统架构设计-以服务为中心的企业整合实践

生命周期 业务分析服务建模架构设计系统开发 案例背景 某航空公司的信息系统已有好几十年的历史。该航空公司的主要业务系统构建于20世纪七八十年代&#xff0c;以IBM的主机系统为主。 近年来&#xff0c;该公司已经在几个主要的核心系统之间构建了用于信息集成的信息Hub(I…...

mysql知识点梳理

mysql知识点梳理 一、InnoDB引擎中的索引策略&#xff0c;了解过吗&#xff1f;二、一条 sql 执行过长的时间&#xff0c;你如何优化&#xff0c;从哪些方面入手&#xff1f;三、索引有哪几种类型&#xff1f;四、SQL 约束有哪几种呢&#xff1f;五、drop、delete、truncate的区…...

版本排序,(如果 版本 是 1,1a,1.1a, 2, 2c , 1c , 1.2a, 3 , 5b , 5)进行排序

如果 版本 是 1&#xff0c;1a&#xff0c;1.1a&#xff0c; 2&#xff0c; 2c &#xff0c; 1c &#xff0c; 1.2a&#xff0c; 3 &#xff0c; 5b &#xff0c; 5 对上面的进行排序 利用 VersionComparator 导入依赖 <dependency><groupId>cn.hutool</groupId…...

Google视觉机器人超级汇总:从RT、RT-2到AutoRT、SARA-RT、RT-Trajectory

前言 随着对视觉语言机器人研究的深入&#xff0c;发现Google的工作很值得深挖&#xff0c;比如RT-2 ​想到很多工作都是站在Google的肩上做产品和应用&#xff0c;​Google真是科技进步的核心推动力&#xff0c;做了大量大模型的基础设施&#xff0c;服 故有了本文&#xf…...

python笔记(9)Dictionary(字典)

目录 创建字典 取值 修改字典 删除 内置函数和方法 创建字典 字典键值和value用&#xff1a;隔开&#xff0c;键值是不可变的&#xff0c;而且必须是唯一的&#xff0c;值可以变&#xff0c;可以是任意类型 dict {key1 : value1, key2 : value2 } 1&#xff09;不允许同…...

蓝桥杯嵌入式总结

用到外部时钟&#xff1a;UART,ADC,RTC 用到中断&#xff1a;UART,TIM LED_KEY: 将高低电平写入对应引脚 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); 读取对应引脚的电平状态 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) UART: 发送&#xff1a; int fputc(int …...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...