数据结构:线性表
1、线性表概述
1.1线性表的定义
线性表(list):零个或多个数据元素的有限序列。
简单地来说,我们可以用下面这张图来描述一个线性表:
1.2 线性表的存储结构
1.2.1顺序存储结构——顺序表
顺序表是将数据全部存储到一整块内存空间中,数据元素之间按照次序挨个存放。
1.2.2链式存储结构——链表
链表不强制要求数据在内存中集中存放,各个元素可以分散存放在内存中。
2、顺序表
2.1顺序表的定义

接下来我们用代码进行描述:
#define LIST_MAX_NUM 100
typedef struct
{int list[LIST_MAX_NUM];int len;
}Linear_List_Type;Linear_List_Type mylist;
这段代码定义了一个结构体类型 Linear_List_Type
,并创建了一个该类型的变量 mylist
。
代码解析:
-
typedef struct { ... } Linear_List_Type;
:这行代码定义了一个结构体,并使用typedef
为该结构体起了一个别名Linear_List_Type
。这意味着在以后使用Linear_List_Type
这个名字就代表了这个结构体类型。 -
int list[LIST_MAX_NUM];
:这是一个整数数组,数组的长度是LIST_MAX_NUM
,这个宏应该在其他地方定义过,用来表示数组的最大长度。 -
int len;
:这是一个整数变量,用来存储数组中当前有效元素的数量,也就是线性表的长度。 -
Linear_List_Type mylist;
:这行代码定义了一个名为mylist
的变量,类型是Linear_List_Type
,也就是前面定义的结构体类型。mylist
代表一个具体的线性表实例。
2.2顺序表的基本操作
2.2.1初始化
初始化操作的意义:
- 该函数将传入的线性表的长度
len
设置为 0,从而将线性表重置为空状态。 - 在数据结构中,初始化操作是确保线性表在使用之前处于一个已知的、正确的状态。这通常是使用线性表的第一步操作。
void InitList(Linear_List_Type* p)
{p->len = 0;
}
代码解析:
-
函数声明
void InitList(Linear_List_Type* p)
:void
:表示该函数没有返回值。InitList
:函数名称,用于初始化线性表。Linear_List_Type* p
:函数的参数是一个指向Linear_List_Type
类型的指针p
。这个指针用于指向需要初始化的线性表。
-
p->len = 0;
:p->len
:通过指针p
访问线性表结构体中的len
成员。=
:赋值运算符。0
:将len
设置为 0。- 这一步将线性表的长度初始化为 0,表示线性表为空,没有有效元素。
2.2.2插入
假设线性表的存储空间为V[1:m],表长为n,插入位置i,插入元素b,则代码如下:
void InsertList(Linear_List_Type* p, int m, int i, int b)
{int k;if (p->len == m){printf("overflow");return;}if (i > p->len){i = p->len + 1;}else if (i < 1){i = 1;}for (k = p->len; k >= i; k--){p->list[k] = p->list[k - 1];}p->list[i - 1] = b;p->len += 1;
}
-
参数说明:
- 线性表的指针用于操作目标线性表。
- 参数包括线性表的最大容量、插入位置、以及要插入的元素。
-
判断线性表是否已满:
- 首先检查线性表当前长度是否已达最大容量,如果已满,打印“overflow”提示并退出函数,防止溢出错误。
-
调整插入位置:
- 检查插入位置是否超出当前长度,如果插入位置大于当前长度,将位置调整为表的末尾。
- 如果插入位置小于 1,则将插入位置调整为第一个位置。
-
移动元素腾出插入空间:
- 从线性表的最后一个元素开始,逐个向后移动元素,为插入新元素腾出空间。
-
插入新元素:
- 将新元素插入到调整好的位置。
-
更新线性表长度:
- 插入后,更新线性表的长度以反映新的元素数量。
2.2.3删除
void DeleteList(Linear_List_Type* p, int i)
{int k;if (p->len == 0){printf("underflow");return;}if (i<1 || i>p->len){printf("this element is not in the list");return;}for (k = i; k < p->len; k++){p->list[k - 1] = p->list[k];}p->len -= 1;return;
}
步骤解析:
-
函数定义与参数说明:
Linear_List_Type* p
:指向线性表的指针,操作的目标是这个线性表。int i
:表示要删除的元素的位置,从 1 开始计数。
-
检查线性表是否为空:
if (p->len == 0)
:判断线性表是否为空,即当前长度是否为 0。- 如果线性表为空,则打印
"underflow"
提示,表示删除操作无法进行,并立即返回。
-
检查删除位置是否有效:
if (i < 1 || i > p->len)
:判断插入位置是否超出有效范围。- 如果
i
小于 1 或大于当前线性表的长度,说明删除位置无效。 - 打印
"this element is not in the list"
提示,并退出函数。
- 如果
-
移动元素填补空位:
for (k = i; k < p->len; k++)
:从删除位置i
开始,将其后的元素依次向前移动。p->list[k - 1] = p->list[k];
:将第k
位置的元素移动到k-1
位置,逐步覆盖被删除的元素位置。
-
更新线性表的长度:
p->len -= 1;
:删除元素后,线性表的长度减少 1。
-
函数返回:
return;
:结束函数,返回到调用者。
总结:
相关文章:

数据结构:线性表
1、线性表概述 1.1线性表的定义 线性表(list):零个或多个数据元素的有限序列。 简单地来说,我们可以用下面这张图来描述一个线性表: 1.2 线性表的存储结构 1.2.1顺序存储结构——顺序表 顺序表是将数据全部存储到…...
Ansible PlayBook实践案例
一、PlayBook介绍 1.什么是playbook playbook 顾名思义,即剧本,现实生活中演员按照剧本表演,在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样…...

Tomcat后台弱口令部署war包
1.环境搭建 cd /vulhub/tomcat/tomcat8 docker-compose up -d 一键启动容器 2.访问靶场 点击Manager App tomcat8的默认用户名和密码都是tomcat进行登录 3.制作war包 先写一个js的一句话木马 然后压缩成zip压缩包 最后修改后缀名为war 4.在网站后台上传war文件 上传war文件…...

胤娲科技:DeepMind的FermiNet——带你穿越“薛定谔的早餐桌”
当AI遇上量子迷雾,FermiNet成了你的“量子导航仪” 想象一下,你早晨醒来,发现家里的厨房变成了薛定谔的实验室,你的咖啡杯和吐司同时处于“存在与不存在”的叠加态。 你伸手去拿,却不确定会不会摸到冰冷的空气或是热腾…...

迅为iTOP-STM32MP157开发板板载4G接口(选配)_千兆以太网_WIFI蓝牙模块_HDMI_CAN_RS485_LVDS接口等
迅为ITOP-STM32MP157是基于ST的STM32MP157芯片开发的一款开发平台。在STM32MP157开发平台上,我们也做了比较多的创新,其中重要的一点就是,iTOP-STM32MP157核心板电源管理采用ST全新配套研制的PMIC电源管理芯片STPMU1A。为整个系统的稳定运行提…...

Android Choreographer 监控应用 FPS
Choreographer 是 Android 提供的一个强大的工具类,用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程,以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息,从而为性能监测和优化提供重要的数据支持。 …...

关于 mybatis-plus-boot-starter 与 mybatis-spring-boot-starter 的错误
不是知道你是否 出现过这样的错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 经过各种度娘,无非就是让你检查三种情况 情况一:mapper.xml没有按照传统的maven架构进行放置 情况二:mybatis的配置信…...

NLP 文本分类任务核心梳理
解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据,核心解决方案: 自己构造训练样本 数据增强,如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…...

k8s中pod的创建过程和阶段状态
管理k8s集群 kubectl k8s中有两种用户 一种是登录的 一种是/sbin/nologin linux可以用密码登录,也可以用证书登录 k8s只能用证书登录 谁拿到这个证书,谁就可以管理集群 在k8s中,所有节点都被网络组件calico设置了路由和通信 所以pod的ip是可以…...

NSSCTF刷题篇1
js类型 [SWPUCTF 2022 新生赛]js_sign 这是一道js信息泄露的题目直接查看源码,有一个main.js文件点击之后,有一串数字和一段base64编码,解开base64编码得到这个编码为敲击码 解码在线网站:Tap Code - 许愿星 (wishingstarmoye.…...

[数据集][目标检测]棉花叶子病害检测数据集VOC+YOLO格式977张22类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):977 标注数量(xml文件个数):977 标注数量(txt文件个数):977 标注类别…...
产品经理面试整理-常见面试问题
以下是一些常见的产品经理面试问题及其解答思路。这些问题涵盖了产品管理的各个方面,包括战略、执行、数据分析、用户体验、跨团队合作等。在准备这些问题时,使用结构化的回答方式(如STAR法)能够帮助你更好地表达你的观点和经验。 1. 常见产品经理面试问题 1.1 你如何定义用…...

数据库(选择题)
基本概念 数据库(DB):长期存储在计算机内的、有组织的、可共享的数据集合。 数据库管理系统(DBMS):它是数据库的机构,是一个系统软件,负责数据库中的数据组织、数据操纵、数据维护…...

粒子向上持续瀑布动画效果(直接粘贴到记事本改html即可)
代码: 根据个人喜好修改即可 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>宽粒子向上…...
卷积神经网络(CNN):深度学习中的视觉奇迹
目录 一、什么是卷积神经网络? 二、CNN的核心组件 1. 卷积层(Convolutional Layer) 2. 激活函数(Activation Function) 3. 池化层(Pooling Layer) 4. 全连接层(Fully Connected…...
Vue:加载本地视频
目录 封装视频弹框调用视频组件 封装视频弹框 <template><el-dialog class"videoBox" :title"title" :visible.sync"visible" width"40%" :before-close"handleOnClose" :close-on-click-modal"false" …...

论文阅读:A Generalization of Transformer Networks to Graphs
论文阅读:A Generalization of Transformer Networks to Graphs 论文地址1 摘要2 贡献Graph TransformerOn Graph Sparsity(图稀疏)On Positional Encodings(位置编码)3 Graph Transformer Architecture(架…...

中国计量大学《2022年801+2022年819自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《25届中国计量大学801819自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2022年801真题 2022年819真题 Part1:2022年完整版真题 2022年801…...

创客匠人运营课堂|增强用户的参与度和忠诚度,这一个工具就能实现!
活动投票是通过营销活动来提升用户粘性及平台裂变效果的工具。可以让活动得到更好的传播,平台品牌得到更大的曝光。 使用场景 活动投票是一种互动营销手段,适用于各种活动场景,具有增强用户的参与度和忠诚度,提高活动的透明度和公…...

k8s 微服务 ingress-nginx 金丝雀发布
目录 一 什么是微服务 二 微服务的类型 三 ipvs模式 3.1 ipvs模式配置方式 四 微服务类型详解 4.1 clusterip 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 loadbalancer 4.5 metalLB 4.6 externalname 五 Ingress-nginx 5.1 ingress-nginx功能 5.2 部署…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...