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

【数据结构】线性表(一)线性表的定义及其基本操作(顺序表插入、删除、查找、修改)

目录

一、线性表

1. 线性表的定义

2. 线性表的要素

二、线性表的基本操作

三、线性表的顺序存储结构

1. 定义

2. 顺序表的操作      

a. 插入操作

b. 删除操作

c. 查找操作

d. 修改操作

e. 代码实例


一、线性表

1. 线性表的定义

        一个线性表是由零个或多个具有相同类型的结点组成的有序集合。

        这里用(a1,a2,…,an)来表示一个线性表,n为自然数:

① 当n=0时,线性表中无结点(或曰包含零个结点),这样的线性表被称为空表

② 当n=1时,线性表中仅有一个结点,该结点既是表头(head),又是表尾(tail)

③ 当n≥1时,称a1为线性表的表头,称an为线性表的表尾;

④ 当n≥2时,称aiai+1的前驱结点,称ai+1为ai后继结点,其中1≤ i < n;表头结点无前驱结点,表尾结点无后继结点。

        线性表中的元素之间存在一对一的关系,也就是说每个元素都有一个直接前驱和一个直接后继,除了第一个元素没有前驱,最后一个元素没有后继。线性表可以用来表示各种具有线性关系的数据,例如数组、链表等。

2. 线性表的要素

  • 元素类型:线性表中的元素具有相同的数据类型,可以是整数、字符、结构体等。
  • 元素个数:线性表中的元素个数可以是任意的,可以是有限的或无限的
  • 元素顺序:线性表中的元素按照一定的次序排列,每个元素都有一个唯一的位置
  • 关系定义:线性表中的元素之间存在顺序关系,每个元素都与它的前驱和后继相连。
  • 表头和表尾:线性表有一个表头和一个表尾,表头是线性表中第一个元素,表尾是线性表中最后一个元素。

二、线性表的基本操作

        ①创建一个线性表

        ②确定线性表的长度

        ③确定线性表是否为空

        ④存取表中指定位置结点的字段值

        ⑤查找指定字段值在表中的位置

        ⑥删除表中指定位置的结点

        ⑦在表中指定位置插入一个新结点

三、线性表的顺序存储结构

1. 定义

        按照线性表结点间的逻辑顺序依次将它们存储于一组地址连续的存储单元中的存储方式被称为线性表的顺序存储方式

        按顺序存储方式存储的线性表具有顺序存储结构,一般称之为顺序表。换言之,在程序中采用定长的一维数组,按照顺序存储方式存储的线性表,被称为顺序表。若顺序表中的元素按其值有序,则称其为有序顺序表

        在高级程序设计语言中,“数组”这种数据类型同样具有随机存储的特性,因此用高级程序设计语言实现线性表的顺序存储结构时,通常选择数组。因此,数组的长度就是顺序表的最大长度(MaxSize),顺序表的实际长度为length,其值必须小于等于MaxSize。

// 定义顺序表结构体
typedef struct {int data[MAX_SIZE];  // 用数组存储元素int length;          // 顺序表的长度
} SeqList;

结构体基础知识:

【重拾C语言】八、表单数据组织——结构体(类型、类型别名、直接/间接访问;典例:复数、成绩单)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/133793105?spm=1001.2014.3001.5502

2. 顺序表的操作      

// 初始化顺序表
void initSeqList(SeqList *list) {list->length = 0;
}

a. 插入操作

        插入操作用于向顺序表中插入一个新的元素:需要将插入位置之后的所有元素依次后移一位,为新元素腾出空间,并将新元素放入目标位置。

int insert(SeqList *list, int position, int element) {if (position < 0 || position > list->length || list->length == MAX_SIZE) {return 0;  // 插入位置非法或顺序表已满,插入失败}// 将插入位置之后的元素依次后移一位for (int i = list->length - 1; i >= position; i--) {list->data[i + 1] = list->data[i];}// 在插入位置放入新元素list->data[position] = element;list->length++;return 1;  // 插入成功
}

b. 删除操作

        删除操作用于从顺序表中删除指定位置的元素:需要将删除位置之后的所有元素依次前移一位,覆盖被删除的元素,同时将顺序表的长度减一。

int delete(SeqList *list, int position) {if (position < 0 || position >= list->length) {return 0;  // 删除位置非法,删除失败}// 将删除位置之后的元素依次前移一位for (int i = position + 1; i < list->length; i++) {list->data[i - 1] = list->data[i];}list->length--;return 1;  // 删除成功
}

c. 查找操作

        查找操作可以根据元素的值进行查找,也可以根据位置进行查找。

  • 对于按值查找,需要遍历顺序表的所有元素,逐个比较元素的值;
  • 对于按位置查找,直接通过索引访问数组中的元素即可。

int search(SeqList *list, int element) {for (int i = 0; i < list->length; i++) {if (list->data[i] == element) {return i;  // 找到元素,返回索引}}return -1;  // 未找到元素
}

d. 修改操作

        修改操作用于修改顺序表中指定位置的元素的值:可以通过索引直接访问到目标位置的元素,并进行修改。

        在顺序存储结构中,插入和删除操作可能需要移动大量元素,导致时间复杂度较高。而查找和修改操作可以在常数时间内完成,时间复杂度为O(1)。

int modify(SeqList *list, int position, int newElement) {if (position < 0 || position >= list->length) {return 0;  // 修改位置非法,修改失败}list->data[position] = newElement;return 1;  // 修改成功
}

e. 代码实例

#include <stdio.h>#define MAX_SIZE 100// 定义顺序表结构体
typedef struct {int data[MAX_SIZE];  // 用数组存储元素int length;          // 顺序表的长度
} SeqList;// 初始化顺序表
void initSeqList(SeqList *list) {list->length = 0;
}// 插入操作
int insert(SeqList *list, int position, int element) {if (position < 0 || position > list->length || list->length == MAX_SIZE) {return 0;  // 插入位置非法或顺序表已满,插入失败}// 将插入位置之后的元素依次后移一位for (int i = list->length - 1; i >= position; i--) {list->data[i + 1] = list->data[i];}// 在插入位置放入新元素list->data[position] = element;list->length++;return 1;  // 插入成功
}// 删除操作
int delete(SeqList *list, int position) {if (position < 0 || position >= list->length) {return 0;  // 删除位置非法,删除失败}// 将删除位置之后的元素依次前移一位for (int i = position + 1; i < list->length; i++) {list->data[i - 1] = list->data[i];}list->length--;return 1;  // 删除成功
}// 查找操作(按值查找)
int search(SeqList *list, int element) {for (int i = 0; i < list->length; i++) {if (list->data[i] == element) {return i;  // 找到元素,返回索引}}return -1;  // 未找到元素
}// 修改操作
int modify(SeqList *list, int position, int newElement) {if (position < 0 || position >= list->length) {return 0;  // 修改位置非法,修改失败}list->data[position] = newElement;return 1;  // 修改成功
}int main() {SeqList list;initSeqList(&list);// 在顺序表中插入元素insert(&list, 0, 10);insert(&list, 1, 20);insert(&list, 2, 30);// 删除顺序表中的元素delete(&list, 1);// 查找顺序表中的元素int index = search(&list, 30);if (index != -1) {printf("元素30的索引为:%d\n", index);} else {printf("未找到元素30\n");}// 修改顺序表中的元素modify(&list, 0, 40);return 0;
}


 

相关文章:

【数据结构】线性表(一)线性表的定义及其基本操作(顺序表插入、删除、查找、修改)

目录 一、线性表 1. 线性表的定义 2. 线性表的要素 二、线性表的基本操作 三、线性表的顺序存储结构 1. 定义 2. 顺序表的操作 a. 插入操作 b. 删除操作 c. 查找操作 d. 修改操作 e. 代码实例 一、线性表 1. 线性表的定义 一个线性表是由零个或多个具有相同…...

MyBatis的自定义插件

MyBatis的自定义插件 前置知识 MyBatis 可以拦截的四大组件 Executor - 执行器StatementHandler - SQL 语句构造器ParameterHandler - 参数处理器ResultSetHandler - 结果集处理器 自定义 MyBatis 插件 /*** 打印 sql 执行的时间插件*/ Intercepts(// 指定拦截器拦截的对象…...

生物制剂\化工\化妆品等质检损耗、制造误差处理作业流程图(ODOO15/16)

生物制剂、化工、化妆品等行业&#xff0c;因为产品为液体&#xff0c;产品形态和质量容易在各个业务环节发生变化&#xff0c;常常导致实物和账面数据不一致&#xff0c;如果企业业务流程不清晰&#xff0c;会导致系统大量的库存差异&#xff0c;以及财务难以核算的问题&#…...

vbv介绍

VBV模型 VBV即Video Buffer Verifier(视频缓冲区校验器)。 本质是encoder端的一个虚拟buffer,可以将VBV当做一个容量受限的管道,有一个上限容量值和下限容量值,在经过此管道的调节之后能限制编码码率在上限容量值和下限容量值之间。VBV对标NetEq中的那几个buffer(decoder b…...

Linux CentOS 8(网卡的配置与管理)

Linux CentOS 8&#xff08;网卡的配置与管理&#xff09; 目录 一、项目介绍二、命令行三、配置文件四、图形画界面的网卡IP配置4.1 方法一4.2 方法二 一、项目介绍 Linux服务器的网络配置是Linux系统管理的底层建筑&#xff0c;没有网络配置&#xff0c;服务器之间就不能相互…...

python -m pip install 和 pip install 的区别解析

python -m pip install 和 pip install 的区别解析 python -m pip install 使用了 -m 参数来确保以 Python 模块的形式运行 pip&#xff0c;适用于确保在不同的环境中正确使用 pip&#xff0c;这篇文章主要介绍了python -m pip install 和 pip install 的区别,需要的朋友可以参…...

深度解读js中数组的findIndex方法

js中数组有一个findIndex方法&#xff0c;这个方法是一个让人感到很困惑的方法。 首先来看看MDN对这个方法的解释&#xff1a;Array.prototype.findIndex() - JavaScript | MDN The findIndex() method of Array instances returns the index of the first element in an arra…...

ICML2021 | RSD: 一种基于几何距离的可迁移回归表征学习方法

目录 引言动机分析主角&#xff08;Principal Angle&#xff09;表征子空间距离正交基错配惩罚可迁移表征学习实验数据集介绍 实验结果总结与展望 论文链接 相关代码已经开源 引言 深度学习的成功依赖大规模的标记数据&#xff0c;然而人工标注数据的代价巨大。域自适应&…...

中国人民大学与加拿大女王大学金融硕士:在该奋斗的岁月里,对得起每一寸光阴

在这个快速变化的世界中&#xff0c;金融行业面临不断更新的挑战和机遇。为了应对这些挑战&#xff0c;中国人民大学与加拿大女王大学合作举办金融硕士项目&#xff0c;旨在培养具有国际视野、扎实的金融理论基础和实战经验的专业人才。 中国人民大学和加拿大女王大学金融硕士…...

Python基础教程:装饰器的详细教程

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、什么是装饰器 目的&#xff1a;给func()方法&#xff0c;增加一个功能&#xff0c;在fun()执行期间&#xff0c;同时把fun()执行速率机算出来 import time def func():print(嘻嘻哈哈)start_time time.time() ti…...

Apache poi xwpf word转PDF中文显示问题解决

原问题解决方法&#xff1a;https://github.com/opensagres/xdocreport/issues/161 POM依赖 <properties><java.version>1.8</java.version><poi.version>3.14</poi.version></properties><dependencies><dependency><gro…...

Gartner发布2024年十大战略技术趋势

今日&#xff0c;Gartner发布了2024年企业机构需要探索的十大战略技术趋势。这十大趋势包括&#xff1a;全民化的生成式&#xff1b;AI 信任、风险和安全管理&#xff1b;AI 增强开发&#xff1b;智能应用&#xff1b;增强型互联员工队伍&#xff1b;持续威胁暴露管理&#xff…...

在UniApp中使用uni.makePhoneCall方法调起电话拨打功能

目录 1.在manifest.json文件中添加权限 2. 组件中如何定义 3.如何授权 4.相关知识点总结 1.在manifest.json文件中添加权限 {"permissions": {"makePhoneCall": {"desc": "用于拨打电话"}} }2. 组件中如何定义 <template>…...

苹果手机怎么刷机?掌握好这个方法!

苹果手机以其优秀的性能与高颜值的设计赢得了一大批用户的喜爱。但是&#xff0c;当手机使用久了以后&#xff0c;难免会出现一些系统问题。在遇到运行不稳定、忘记锁屏密码、软件故障、频繁死机等情况时&#xff0c;我们可能需要对手机进行刷机来解决问题。那么&#xff0c;苹…...

最新ai创作系统CHATGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…...

代码随想录算法训练营Day56|动态规划14

代码随想录算法训练营Day56|动态规划14 文章目录 代码随想录算法训练营Day56|动态规划14一、1143.最长公共子序列二、 1035.不相交的线三、53. 最大子序和 动态规划 一、1143.最长公共子序列 class Solution {public int longestCommonSubsequence(String text1, String text2…...

VsCode通过Git History插件查看某个页面的版本修改记录

首先需要安装插件Git History 方式一&#xff1a;通过 点击File History 查看某个文件变更&#xff1b;即通过commit的提交记录去查看某个文件的修改 方式二&#xff1a;通过点击选择toggle File Blame 查看当前页面每一行所有提交修改记录...

事件循环(渡一)

一、事件循环 浏览器有哪些进程和线程 浏览器是一个多进程多线程的应用程序&#xff0c;当启动浏览器后&#xff0c;会默认启动多个进程 可以在浏览器任务管理器中查看所有进程 其中最主要的进程有&#xff1a; 浏览器进程 主要负责界面展示&#xff0c;用户交互&#xff0c;…...

eNSP在hybrid接口上配置vlan

一、什么是vlan VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种通信技术&#xff0c;它可以将一个物理的局域网在逻辑上划分成多个广播域。每个VLAN都是一个广播域&#xff0c;VLAN内的主机可以直接通信&#xff0c;而VLAN之间则不能直…...

行为型模式-迭代器模式

迭代器模式是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素&#xff0c;不需要知道集合对象的底层表示。 意图&#xff1a;提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决&#xff1a;不同的方式…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...