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

【数据结构】顺序表的定义和运算

目录

1.初始化

2.插入

3.删除

4.查找

5.修改

6.长度

7.遍历

8.完整代码


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

在C语言中,线性表的顺序存储结构可以使用数组来实现。顺序表是一种将元素按照顺序存储在连续的存储空间中的线性结构。

顺序表可以使用结构体来定义,例如:

#define MAXSIZE 100  // 线性表的最大长度typedef struct {int data[MAXSIZE];  // 存储线性表元素的数组int length;         // 当前线性表长度
} List;

以下是顺序表的基本运算:

1.初始化

初始化一个空的顺序表:

void initList(List *L) {L->length = 0;
}

L:指向顺序表的指针。

将顺序表的长度length赋值为0,相当于清空了顺序表,使得顺序表L中不再有任何元素。

2.插入

在某个位置插入一个元素,使得该位置原来的元素和之后的元素往后移动:

int listInsert(List *L, int i, int elem) {int j;if (i < 1 || i > L->length + 1) {return 0; // 越界}if (L->length >= MAXSIZE) {return 0; // 线性表已满}for (j = L->length; j >= i; j--) {L->data[j] = L->data[j-1];}L->data[i-1] = elem;L->length++;return 1;
}

函数的目的是将一个元素elem插入到顺序表L的第i个位置。

i:要插入的位置

elem:要插入的元素的值

代码的逻辑:

(1)判断要插入的位置i是否越界,即是否小于1或大于线性表的长度加1。如果越界则返回0,表示失败。

(2)判断顺序表L是否已满,即顺序表的长度是否达到了最大容量MAXSIZE。如果已满则返回0,表示失败。

(3)通过一个循环,将从位置i开始的元素都向后移动一位,为要插入的元素留出空位。

(4)将要插入的元素elem赋值给位置i-1的元素。

(5)增加顺序表的长度。

(6)返回1,表示插入成功。

3.删除

删除某个位置的元素,使得该位置后面的元素往前移动:

int listDelete(List *L, int i) {int j;if (i < 1 || i > L->length) {return 0; // 越界}for (j = i; j < L->length; j++) {L->data[j-1] = L->data[j];}L->length--;return 1;
}

i:要删除的元素的位置

代码的逻辑:

(1) 判断要删除的位置i是否越界,即是否小于1或大于顺序表的长度。如果越界则返回0,表示失败。

(2)通过一个循环,将从位置i+1开始的元素都向前移动一位,覆盖了要被删除的元素。

(3)减少顺序表的长度。

(4)返回1,表示删除成功。

4.查找

根据值或位置查找一个元素:

int locateElem(List *L, int elem) {int i;for (i = 0; i < L->length; i++) {if (L->data[i] == elem) {return i+1;}}return 0; // 没找到
}

elem:要查找的元素的值

代码的逻辑:

(1)通过一个循环,遍历顺序表L中的每个元素。

(2)在循环中,判断当前元素是否等于要查找的元素elem。如果相等,则返回当前元素的位置(即i+1)。

(3)如果循环结束还没有找到相等的元素,则返回0,表示没有找到。

5.修改

根据位置修改某个元素的值:

int setElem(List *L, int i, int elem) {if (i < 1 || i > L->length) {return 0; // 越界}L->data[i-1] = elem;return 1;
}

 i:要设置元素的位置

-elem:要设置的新值

代码的逻辑:

(1)判断要设置的位置i是否越界,即是否小于1或大于线性表的长度。如果越界则返回0,表示失败。

(2)将线性表L的第i个位置的元素值设置为elem。

(3)返回1,表示设置成功。

6.长度

返回顺序表的长度:

int listLength(List *L) {return L->length;
}

直接返回顺序表L的长度L->length。

7.遍历

依次访问顺序表中的每个元素:

void traverseList(List *L) {int i;for (i = 0; i < L->length; i++) {printf("%d ", L->data[i]);}printf("\n");
}

代码的逻辑:

(1)通过一个循环,遍历顺序表L中的每个元素。

(2)在循环中,使用printf函数依次将每个元素的值输出到屏幕上,并在元素之间添加一个空格。

(3)在循环结束后,输出一个换行符,以便下一行输出。

8.完整代码

这里顺序表中的元素均设为 int 类型:

#include <stdio.h>#define MAXSIZE 100  // 线性表的最大长度typedef struct {int data[MAXSIZE];  // 存储线性表元素的数组int length;         // 当前线性表长度
} List;// 初始化线性表
void initList(List *L) {L->length = 0;
}// 在第 i 个位置插入元素 elem
int listInsert(List *L, int i, int elem) {int j;if (i < 1 || i > L->length + 1) {return 0; // 越界}if (L->length >= MAXSIZE) {return 0; // 线性表已满}for (j = L->length; j >= i; j--) {L->data[j] = L->data[j-1];}L->data[i-1] = elem;L->length++;return 1;
}// 删除第 i 个元素
int listDelete(List *L, int i) {int j;if (i < 1 || i > L->length) {return 0; // 越界}for (j = i; j < L->length; j++) {L->data[j-1] = L->data[j];}L->length--;return 1;
}// 查找第一个等于 elem 的元素
int locateElem(List *L, int elem) {int i;for (i = 0; i < L->length; i++) {if (L->data[i] == elem) {return i+1;}}return 0; // 没找到
}// 返回第 i 个元素的值
int getElem(List *L, int i) {if (i < 1 || i > L->length) {return 0; // 越界}return L->data[i-1];
}// 修改第 i 个元素的值为 elem
int setElem(List *L, int i, int elem) {if (i < 1 || i > L->length) {return 0; // 越界}L->data[i-1] = elem;return 1;
}// 返回线性表的长度
int listLength(List *L) {return L->length;
}// 遍历线性表
void traverseList(List *L) {int i;for (i = 0; i < L->length; i++) {printf("%d ", L->data[i]);}printf("\n");
}int main() {List L;initList(&L);listInsert(&L, 1, 1);listInsert(&L, 2, 2);listInsert(&L, 3, 3);printf("插入 1, 2, 3 后的线性表:");traverseList(&L);  // 打印:1 2 3listDelete(&L, 2);printf("删除第 2 个元素后的线性表:");traverseList(&L);  // 打印:1 3int elem = getElem(&L, 2);printf("第 2 个元素的值为%d\n", elem);  // 打印:第 2 个元素的值为3setElem(&L, 1, 4);printf("修改第 1 个元素的值为 4 后的线性表:");traverseList(&L);  // 打印:4 3printf("线性表的长度为 %d\n", listLength(&L)); // 打印:线性表的长度为 2int pos = locateElem(&L, 3);if (pos) {printf("元素 3 的下标为 %d\n", pos);  // 打印:元素 3 的下标为 2} else {printf("元素 3 没有找到\n");}return 0;
}

输出结果如下:

相关文章:

【数据结构】顺序表的定义和运算

目录 1.初始化 2.插入 3.删除 4.查找 5.修改 6.长度 7.遍历 8.完整代码 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &…...

idea使用maven的package打包时提示“找不到符号”或“找不到包”

介绍&#xff1a;由于我们的项目是多模块开发项目&#xff0c;在打包时有些模块内容更新导致其他模块在引用该模块时不能正确引入。 情况一&#xff1a;找不到符号 情况一&#xff1a;找不到包 错误代码部分展示&#xff1a; Failure to find com.xxx.xxxx:xxx:pom:0.5 in …...

MetricBeat监控MySQL

目录 一、安装部署 二、开启mysql监控模块 三、编辑mysql配置文件 四、启动Metricbeat 五、查看监控图表 一、安装部署 metriceat的安装部署参考章节&#xff1a; Metricbeat安装使用&#xff0c;这里不再赘述。 二、开启mysql监控模块 进入metricbeat安装目录 ./metricb…...

Child Mind Institute - Detect Sleep States(2023年第一次Kaggle拿到了银牌总结)

感谢 感谢艾兄&#xff08;大佬带队&#xff09;、rich师弟&#xff08;师弟通过这次比赛机械转码成功、耐心学习&#xff09;、张同学&#xff08;也很有耐心的在学习&#xff09;&#xff0c;感谢开源方案&#xff08;开源就是银牌&#xff09;&#xff0c;在此基础上一个月…...

Esxi7Esxi8设置VMFSL虚拟闪存的大小

Esxi7Esxi8设置VMFSL虚拟闪存的大小 ESXi7,8 默认安装会分配一个 VMFSL(VMFS-L)(Local VMFS)很大空间(120G), 感觉很浪费, 实际给 8G 就可以了, 最少 6G , 经实验,给2G没法安装 . Esxi7是虚拟闪存的 修改的方法是: 在安装时修改 设置 autoPartitionOSDataSize8192 在cdromBoo…...

vue2+electron桌面端一体机应用

vue2+electron项目 前言:公司有一个项目需要用Vue转成exe,首先我使用vue-cli脚手架搭建vue2项目,然后安装electron 安装electron 这一步骤可以省略,安装electron-builder时会自动安装electron npm i electron 安装electron-builder vue add electron-builder 项目中多出…...

目标检测——OverFeat算法解读

论文&#xff1a;OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 作者&#xff1a;Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun 链接&#xff1a;https://arxiv.org/abs/1312.6229 文章…...

vue获取主机id和IP地址

获取主机id和IP地址 在vue.config.js const os require(“os”); function getNetworkIp() { let needHost “”; // 打开的host try { // 获得网络接口列表 let network os.networkInterfaces(); for (let dev in network) { let iface network[dev]; for (let i 0; i …...

在pytorch中自定义dataset读取数据

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 有关我们数据读取预训练 以及如何将它打包成一个一个batch输入我们的网络的 首先我们来看一下之前我们在讲resnet网络时所使用的源码 我们去使用了官方实现的image folder去读取我们的图像数据 然…...

ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders

1.关于稀疏卷积的解释&#xff1a;https://zhuanlan.zhihu.com/p/382365889 2. 答案&#xff1a; 在深度学习领域&#xff0c;尤其是计算机视觉任务中&#xff0c;遮蔽图像建模&#xff08;Masked Image Modeling, MIM&#xff09;是一种自监督学习策略&#xff0c;其基本思想…...

Java后端的登录、注册接口是怎么实现的

目录 Java后端的登录、注册接口是怎么实现的 Java后端的登录接口是怎么实现的 Java后端的注册接口怎么实现&#xff1f; 如何防止SQL注入攻击&#xff1f; Java后端的登录、注册接口是怎么实现的 Java后端的登录接口是怎么实现的 Java后端的登录接口的实现方式有很多种&a…...

TCP Keepalive 和 HTTP Keep-Aliv

HTTP的Keep-Alive 在http1.0的版本中&#xff0c;它是基于请求-应答模型和TCP协议的&#xff0c;也就是在建立TCP连接后&#xff0c;客户端发送一次请求并且接收到响应后&#xff0c;就会立马断开TCP连接&#xff0c;称为HTTP短连接&#xff0c;这种方式比较耗费时间以及浪费资…...

操作系统 复习笔记

操作系统的目标和作用 操作系统的目标 1.方便性 2.有效性 3.可扩展性 4.开放性 操作系统的作用 1.OS作为用户与计算机硬件系统之间的接口 2.OS作为计算机系统资源的管理者 3.OS实现了对计算机系统资源的抽象 推动操作系统发展的主要动力 1.不断提高计算机系统资源的…...

Java中实现单例模式的方式

1. 使用静态内部类实现单例模式 在Java中&#xff0c;使用静态内部类实现单例模式是一种常见而又有效的方式。这种方式被称为“静态内部类单例模式”或者“Holder模式”。这种实现方式有以下优点&#xff1a; 懒加载&#xff08;Lazy Initialization&#xff09;&#xff1a;静…...

Vue3-01-创建项目

环境准备 1.需要用到 16.0 以及更高版本的 node.js 2.使用vscode编辑器进行项目开发可以在命令行中查看node的版本号: node -v创建项目 1.准备一个目录 例如&#xff0c;我创建项目的时候是在该目录下进行的;D:\projectsTest\vue3project2.执行创建命令&#xff08;*&#x…...

Go 语言中的反射机制

欢迎大家到我的博客浏览&#xff0c;更好的阅读体验请点击 反射 | YinKais Blog 反射在大多数的应用和服务中并不常见&#xff0c;但是很多框架都依赖 Go 语言的反射机制简化代码。<!--more-->因为 Go 语言的语法元素很少、设计简单&#xff0c;所以它没有特别强的表达能…...

[leetcode 前缀和]

525. 连续数组 M :::details 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。示例 2: 输入: nums [0,1,0] 输出: …...

Python与ArcGIS系列(十五)根据距离抓取字段

目录 0 简述1 实例需求2 arcpy开发脚本0 简述 在处理gis数据的时候,会遇到这种需求:将一个图层与另一个图层中相近的要素进行字段赋值。本篇将介绍如何利用arcpy及arcgis的工具箱实现这个功能。 1 实例需求 为了介绍这个功能的实现,我们需要有一个特定的功能需求。在这里选…...

YOLOv8分割训练及分割半自动标注

YOLOv8是基于目标检测算法YOLOv5的改进版,它在YOLOv5的基础上进行了优化和改进,加入了一些新的特性和技术,如切片注意力机制、骨干网络的选择等。 本文以yolov8-seg为基准,主要整理分割训练流程及使用v8分割模型进行半自动标注的过程。 一、v8-seg训练 1.1 环境配置 github…...

jsp页面通过class或者id获取a标签上的属性的值

要通过class和id两种方式获取a标签上的某个属性的值&#xff0c;或者给其赋值&#xff0c;可以使用JavaScript。以下是两种方法的示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...