当前位置: 首页 > 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…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...