数据结构速成--顺序表

news2025/6/23 3:57:11

        由于是速成专题,因此内容不会十分全面,只会涵盖考试重点,各学校课程要求不同 ,大家可以按照考纲复习,不全面的内容,可以看一下小编主页数据结构初阶的内容,找到对应专题详细学习一下。 

目录

一、线性表的类型定义

二、顺序表的结构

三、顺序表的实现

1. 数据元素的插入

2. 数据元素的删除


一、线性表的类型定义

        线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。

        除第一个元素外,每个元素有且仅有一个直接前驱。

        除最后一个元素外,每个元素有且仅有一个直接后继。 

         第一部分要求大家了解线性表的基本操作,根据函数名和传递的参数明白该函数实现的具体功能。

二、顺序表的结构

        线性表的顺序存储称为顺序表,它是由一组地址连续的存储单元依次存储线性表中的数据
元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

例:如果一个顺序表中第一个元素的存储地址为1000,每个元素占4个地址单元,那么第6个元素的存储地址应是(      )。

A. 1020       B.1010      C.1016      D.1024

        本道题选 A。sizeof(数据元素的类型)=4,i=6,因此根据上面的公式,得到1000+4*5=1020。

顺序表的特点:

  • 顺序表最主要的特点是随机存取,允许下标的随机访问,因此适合用于随机查找,时间复杂度为O(1)。
  • 顺序表的存储密度高,每个结点只存储数据元素。
  • 顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。 

        第二部分要求大家重点掌握动态顺序表的定义,存储地址的计算以及顺序表的特点。

三、顺序表的实现

1. 数据元素的插入

        假设顺序表长度为n,在顺序表的第i个位置插入新元素e。若i的输入不合法,则返回false,表示插入失败;否则将顺序表的第i个元素及其后的所有元素右移一个位置(即需要挪动n-i+1次元素),腾出一个空位置插入新元素e,顺序表长度增加1,插入成功,返回true。 

bool ListInsert(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1) //判断的范围是否有效
        return false;
    for(int j=L.length;j>=i;j--) //将第i个元素及之后的元素后移
        L.data[j]=L.data[j-1];
    L.data[i-1]=e; //在i位置处放入e
    L.length++; //线性表长度增加1
    return true;
}

2. 数据元素的删除

        删除线性表L中第i个位置的元素,若成功则返回true,并将被删除的元素用引用变量返回,否则返回false。 

bool ListDelete(SqList &L,int i,ElemType &e){
    if(i<1||i>L.length) //判断i的范围是否有效
        return false;
    e=L.data[i-1]; //将被删除的元素赋给e
    for(int j=i;j<L.length;j++) //将第i个位置后的元素后移
        L.data[j-1]=L.data[j];
    L.length--; //线性表长度减1
    return true;
}

         由此可见,插入/删除元素的时间复杂度均为O(n)

例1:将两个有序顺序表A、B合并为一个新的有序顺序表C,并用函数返回结果顺序表。

//定义动态顺序表
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* arr;//存储数据的底层结构
	int capacity;//记录顺序表的空间大小
	int size;//有效数据个数
}SL;
//算法思想:A和B进行比较,谁小就先放到C里
void Merge(SL* A, SL* B, SL* C)
{
	//A和B有效数据之和大于C的容量,就无法存储
	if (A->size + B->size > C->capacity)
		return -1;
	int i = 0, j = 0, k = 0;
	//比较A和B各元素大小,谁小就放到C里
	while (i < A->size && j < B->size) {
		if (A->arr[i] <= B->arr[j])
			C->arr[k++] = A->arr[i++];
		else
			C->arr[k++] = B->arr[j++];
	}
	//跳出循环说明A和B其中一个已经遍历完了,但不知道是哪个先结束了
	//分别判断,让没结束的那个顺序表继续遍历
	while (i < A->size)
	{
		C->arr[k++] = A->arr[i++];
	}
	while (j < B->size)
	{
		C->arr[k++] = B->arr[j++];
	}
	//最后C有效数据的个数就是k
	C->size = k;
}

例2:删除顺序表中所有值为x的数据。

//定义动态顺序表
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* arr;//存储数据的底层结构
	int capacity;//记录顺序表的空间大小
	int size;//有效数据个数
}SL;
//删除指定位置数据
void SLErase(SL* ps, int pos) {
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	//pos以后的数据往前挪动一位
	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;//有效数据-1
}
//算法思想:找到x在顺序表中的位置,在通过删除指定位置的算法实现
void DeleteX(SL* ps, SLDataType x) {
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			SLErase(ps, i);//删除指定位置的元素,下标为i
			//顺序表现在是4 3 2 1 1
			//i=3时删除一个1,顺序表是4 3 2 1
			//但是i++就使得i=4,就会越界,因此要让i--变回i=3的位置
			i--;
		}
	}
}

例3:设计一个高效的算法逆置顺序表。

void Swap(SLDataType* a, SLDataType* b) {
	SLDataType tmp = *a;
	*a = *b;
	*b = tmp;
}
void Reverse(SL* ps) {
	//思路1:创建一个新的顺序表,逆序遍历原顺序表放到新表里,再用新表覆盖原顺序表(效率低下)
	//思路2:交换下标为i和n-i-1的数据
	int n = ps->size;
	for (int i = 0; i < ps->size; i++)
	{
		if (i <= n - i - 1) {
			Swap(&ps->arr[i], &ps->arr[n - i - 1]);
		}
	}
	return ps;
}

        第三部分是本章最为重要的内容,需要大家熟练掌握插入和删除元素的基本算法思路,一定要注意,在执行操作之前,一定要判断所给的参数是否合法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1584616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯-单片机基础16——利用定时计数中断进行动态数码管的多窗口显示

综合查阅了网络上目前能找到的所有关于此技能的代码&#xff0c;最终找到了下述方式比较可靠&#xff0c;且可以自定义任意显示的数值。 传统采用延时函数的方式实现动态数码管扫描&#xff0c;在题目变复杂时效果总是会不佳&#xff0c;因此在省赛中有必要尝试采用定时计数器中…

ubuntu20挂载webdav

WebDAV 是个好东西&#xff0c;尤其是配个自己的 NAS 使用&#xff0c;熟悉以后就再也离不开它啦 sudo apt-get update sudo apt-get install davfs2 上下左右键可以切换到“是”选项 2.创建目录挂载点 sudo mkdir /mnt/webdav 3.配置 davfs2 编辑 davfs2.conf 文件以配置 da…

KKVIEW远程畅连远程控制对方手机

畅连远程控制对方手机&#xff1a;技术、安全与实用性探讨 随着科技的飞速发展&#xff0c;远程控制技术在多个领域得到了广泛应用。其中&#xff0c;手机远程控制作为一项新兴技术&#xff0c;受到了广泛关注。畅连远程控制作为其中的一种实现方式&#xff0c;为用户提供了便…

【IC前端虚拟项目】验证环境方案思路和文档组织

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 对于mvu的验证环境,从功能角度就可以分析出需要搭建哪些部分,再看一下mvu的周围环境哈: 很明显验证环境必然要包括几个部分: 1.模拟idu发送指令; 2.模拟ram/ddr读写数据; 3.rm模拟mvu的行为; …

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区&#xff1a;开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区&#xff1a;开源数据库官方网站官方介绍贡献攻略开源技术…

Java Set基础篇

目录 前言一、常用Set1.1 Set1.1.1 特点 1.2 HashSet1.2.1 特点1.2.2 使用 1.3 TreeSet1.3.1 特点1.3.2 使用 1.4 LinkedHashSet1.4.1 特点1.4.2 使用 二、对比总结 目录 前言 一、常用Set 1.1 Set Set是一个继承自Collection的接口&#xff1a; public interface Set<…

Linux 用管道实现一个简易版的进程池

概念 进程池其实就是我们提前创建好一批进程&#xff0c; 当有任务的时候再将进程指派过去完成那个任务。 中间的这框框就是管道&#xff0c; 当父进程没有给子进程发送任务的时候&#xff0c; 子进程就会一直阻塞着&#xff0c; 于是就形成了这样的结构。 代码 #include &q…

如何在 YouTube、Medium、Twitter 和 Linkedin 上使用 ChatGPT 赚钱

人工智能SEO&#xff1a;未来内容优化的革命 介绍 在当今的数字时代&#xff0c;利用 ChatGPT 等人工智能工具已经成为在线内容创建和货币化领域的游戏规则改变者。 本指南探讨了如何在 YouTube、Medium、Twitter 和 Linkedin 等各种平台上有效使用 ChatGPT&#xff0c;不仅可以…

c 解数独(通用方法,适用于9×9 数独)

折腾了一周时间&#xff0c;终于搞定99数独通用方法 思路&#xff1a;1.生成每行空位的值&#xff0c;也就是1-9中除去非0的数。 2.用行&#xff0c;列&#xff0c;宫判断每行中每个空位的最小取值范围后再重新生成每行。 3.随机提取生成的9行&#xff0c;判断每列之和是否等…

SolidWorks Electrical图层管理器

SolidWorks Electrical中的图层是用来管理和控制不同类型的图形对象的显示和隐藏的工具。图层可以帮助用户更好地组织和管理电气设计中的不同元素&#xff0c;提高设计效率和可视化效果。 在SolidWorks Electrical中&#xff0c;用户可以创建多个图层&#xff0c;并为每个图层…

【C 数据结构】顺序表

文章目录 【 1. 基本原理 】【 2. 顺序表的初始化 】【 3. 顺序表 插入元素 】【 4. 顺序表 删除元素 】【 5. 顺序表 查找元素 】【 6. 顺序表 更改元素值 】【 7. 实例 】 【 1. 基本原理 】 顺序表&#xff0c;全名顺序存储结构&#xff0c;是线性表的一种。顺序表对数据的…

openssl3.2 - exp - zlib

文章目录 openssl3.2 - exp - zlib概述笔记命令行实现程序实现备注 - 压缩时无法base64压缩时无法带口令压缩实现 - 对buffer进行压缩和解压缩测试效果工程实现main.cppCOsslZlibBuffer.hCOsslZlibBuffer.cpp总结END openssl3.2 - exp - zlib 概述 客户端和服务端进行数据交换…

无人机低空数字摄影测量系统

一、 系统概述 系统完全基于IDL设计实现&#xff0c;包括界面布局到人机交互再到底层核心函数功能。整体设计框架基于数字摄影测量的专业处理流程&#xff0c;实现了数据输入、数据预处理、影像信息检测、空间定向、地形三维建模、专题信息提取、成果输出与更新等功能。同时为…

Android 10.0 系统设置语言和输入法菜单Launage语言列表增加支持多种英语语言功能

1.前言 在10.0的系统ROM产品定制化开发中,在系统中的语言和输入法菜单中,在添加语言的默认列表中对于同一类型的语言就可以 会出现一中语言,比如多种英语类型 就显示的不全,所以要求显示所有的英语类型,这样就需要了解语言列表的加载流程 然后加载所有的英语类型,接下来…

【深度学习】多层感知机与卷积神经网络解析

引言&#xff1a; 在人工智能的宏伟画卷中&#xff0c;深度学习如同一笔瑰丽而深邃的色彩&#xff0c;为这幅画增添了无限的生命力和潜能。作为支撑这一领域核心技术的基石&#xff0c;多层感知机&#xff08;MLP&#xff09;和卷积神经网络&#xff08;CNN&#xff09;在模仿人…

安全风险攻击面管理如何提升企业网络弹性?

从研究人员近些年的调查结果来看&#xff0c;威胁攻击者目前非常善于识别和利用最具有成本效益的网络入侵方法&#xff0c;这就凸显出了企业实施资产识别并了解其资产与整个资产相关的安全态势的迫切需要。 目前来看&#xff0c;为了在如此复杂的网络环境中受到最小程度上的网络…

Lumos学习python第九课:VSCode+Anaconda

注意Anaconda版本和Python版本的对应关系&#xff0c;同一个Anaconda可以支持多个Python版本&#xff0c; 注&#xff1a;现在vscode已原生支持jupyter notebook&#xff08;要求Python版本>3.6&#xff09; Anaconda在Python解析器的基础上封装了很多Python包&#xff0c…

【CVE-2010-2883】进行钓鱼攻击的研究

最近作业中研究APT攻击&#xff0c;了解到2011年前后披露的LURID-APT&#xff0c;其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现&#xff0c;更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…

基于JAVA的校园失物招领平台

采用技术 基于JAVA的校园失物招领平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 论坛管理 失物认领管理 寻物启事管理 用户管理 失物…

鸿蒙实战开发-如何实现选择并查看文档与媒体文件

介绍 应用使用ohos.file.picker、ohos.multimedia.mediaLibrary、ohos.file.fs 等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用展示出最近打开过的文档信息&#xf…