数据结构入门 — 顺序表详解

news2024/11/20 13:36:51

前言

数据结构入门 — 顺序表详解
博客主页链接:https://blog.csdn.net/m0_74014525
关注博主,后期持续更新系列文章
文章末尾有源码
*****感谢观看,希望对你有所帮助*****


文章目录

  • 前言
  • 一、顺序表
    • 1. 顺序表是什么
    • 2. 优缺点
  • 二、概念及结构
    • 1. 静态顺序表
    • 2. 动态顺序表
  • 三、顺序表接口实现(代码演示)
    • 1. 动态存储结构
    • 2. 顺序表打印
    • 3. 顺序表初始化
    • 4. 检查空间大小
    • 5. 增删查改接口
    • 6. 顺序表销毁
  • 四、所有文件代码
    • 1. Gitee链接
  • 总结


一、顺序表

1. 顺序表是什么

顺序表是连续存储的
顺序表是一种线性表的数据结构,它的数据元素按照一定次序依次存储在计算机存储器中,使用连续的存储空间来存储。顺序表中每个数据元素的位置都有一个序号,这个序号也称为元素在顺序表中的下标。顺序表的特点是:元素的逻辑顺序与物理顺序相同,支持随机访问,插入和删除元素的时间复杂度为O(n),查找元素的时间复杂度为O(1)。

2. 优缺点

优点
优点是访问速度快,因为它的元素在内存中是连续存储的,可以直接通过下标访问,而且不需要额外的空间来存储指向下一个节点的指针。
缺点
缺点是插入和删除元素的时间复杂度为O(n),因为需要移动其他元素的位置,而且不利于动态扩展容量。


二、概念及结构

元素的类型、元素的个数、数组的大小和数组的指针
顺序表的实现需要预留一段连续的存储空间来存储所有的元素,目前常见的实现方式是使用数组来实现顺序表。数组的地址是连续的,因此可以通过数组下标进行快速访问元素。为了实现顺序表,需要定义一个数据结构,包含元素的类型、元素的个数、数组的大小和数组的指针等信息。

1. 静态顺序表

静态顺序表是一种使用连续存储空间实现的线性表结构,其特点是在创建表时就需要预先分配好固定长度的存储空间,表长也就固定了下来,不能动态扩展或缩小。

在静态顺序表中,数据元素按照顺序依次存放,每个元素都占用相同的存储空间,而且元素在内存中的地址也是连续的。
在这里插入图片描述

2. 动态顺序表

动态顺序表是一种线性表的实现方式,它在静态顺序表的基础上,将存储空间由固定长度改为动态分配。

当动态顺序表中存放的元素个数达到当前存储空间的上限时,可以重新申请更大的空间来存放更多的元素,因此动态顺序表的长度是可变的。动态顺序表的实现通常采用数组形式,通过realloc函数来动态分配空间。

在这里插入图片描述


三、顺序表接口实现(代码演示)

1. 动态存储结构

即定义顺序表的结构。由动态开辟的数组、有效数据个数和容量空间的大小组成

typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;  // 指向动态开辟的数组
	int size;		// 有效数据个数
	int capacity;	// 容量空间的大小
}SL;

2. 顺序表打印

使用循环,将顺序表遍历一遍,进行打印

//打印顺序表
void SLPrint(SL* pc)
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		printf("%d ", pc->a[i]);
	}
	printf("\n");
}

3. 顺序表初始化

在顺便表初始化时,先用malloc开辟4个空间,如果开启失败报错并返回

//初始化顺序表
void SLInit(SL *pc)
{
	assert(pc);
	//开启内存  
	pc->a=(SLDataType*)malloc(sizeof(SLDataType) * 4);
	//检查是否开辟成功
	if (pc->a==NULL)
	{
		perror("SLInit");
		//return;
		exit(-1);
	}
	pc->capacity = 4;
	pc->size = 0;
}

4. 检查空间大小

检查空间,当顺序表内的数据等于初始化开辟的空间时,再开辟4个空间(用realloc开辟乘2的空间)

//检查内存容量
void SLCheckCapacity(SL* pc)
{
	assert(pc);
	if (pc->size == pc->capacity)
	{
		SLDataType*tem = (SLDataType*)realloc(pc->a, sizeof(SLDataType)*2*pc->capacity);  //要乘以2
		if (tem == NULL)
		{
			perror("SLCheckCapacity");
			exit(-1);
		}
		pc->a = tem;
		pc->capacity *= 2;
	}
}

5. 增删查改接口

以增删查改顺序依次编排
头插:
头插,即在顺序表头部进行插入数值,在SLCheckCapacity检查空间是否充足后,进行插入数值

//头插
void SLPushFront(SL* pc,SLDataType x)
{
	assert(pc);
	SLCheckCapacity(pc);
	int end = pc->size - 1;
	while (end >=0)
	{
		pc->a[end + 1] = pc->a[end];
		--end;
	}
	pc->a[0] = x;
	pc->size++;
}

尾插:
尾插,即找到顺序表的尾,下标为pc->size的位置插入数值

//尾插
void SLPushBack(SL* pc, SLDataType x)
{
	assert(pc);
	SLCheckCapacity(pc);
	pc->a[pc->size] = x;
	pc->size++;
}

头删:
头删,将后面的数值依次向前覆盖。覆盖时要注意顺序,将在前的先覆盖,防止数组丢失,然后将顺序表的size(数据个数减一)

//头删
void SLPopFront(SL* pc)
{
	assert(pc);
	int start = 1;
	while (start < pc->size)
	{
		pc->a[start] = pc->a[start + 1];
		++start;
	}
	pc->size--;
}

尾删:
尾删,即将有效数据减一,直接将pc所指向的size减一

//尾删
void SLPopBack(SL* pc)
{
	assert(pc->size > 0);

	pc->size--;
}

查找:
查找方法有很多种,这里使用暴力查找,将顺序表遍历一遍,找到要找的元素并返回下标

//查找数字位置
int SLFind(SL* pc, SLDataType x)
{
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		if (pc->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

指定位置插入
这里配合查找函数使用,找到要找的数值的下标,进入下列函数,将pos之后的值依次下向后移动,在pos位置插入数值

// 在pos位置插入x
void SLInsert(SL* pc, int pos, SLDataType x)
{
	assert(pc);
	assert(pos >= 0 && pos <= pc->size);
	SLCheckCapacity(pc);
	int end = pc->size - 1;
	while (end >= pos)

	{

		pc->a[end + 1] = pc->a[end];
		--end;
	}
	pc->a[pos] = x;
	pc->size++;

}

指定位置删除
这里配合查找函数使用,找到要找的数值的下标,进入下列函数,将pos位置后的数值依次向前覆盖

// 删除pos位置的值
void SLErase(SL* pc, int pos)
{
	assert(pc);
	assert(pos >= 0 && pos < pc->size);
	int start = pos+ 1;
	while (start < pc->size)
	{
		pc->a[start - 1] = pc->a[start];
		++start;

	}
	pc->size--;
}

更改指定位置
这里配合查找函数使用,找到要找的数值的下标,进入下列函数,将pos位置的值进行修改

//更改制定位置的数字
void SLModify(SL* pc, int pos, SLDataType x)
{
	assert(pc);
	assert(pos >= 0 && pos < pc->size);
	pc->a[pos] = x;
 }

6. 顺序表销毁

顺序表进行销毁,将开辟的数值空间进行释放,并置为空(NULL)将空间和数据个数置为0 ,这样顺序表就销毁完成


//销毁释放内存
void SLDestroy(SL* pc)
{
	assert(pc);
	free(pc->a);
	pc->a=NULL;
	pc->capacity = 0;
	pc->size=0;
}


四、所有文件代码

1. Gitee链接

***查看所有代码***
点击右边蓝色文字 DuckBro Gitee 代码仓库


总结

顺序表是一种线性表,它的重点是:

  1. 物理结构:顺序表的数据元素在内存中是连续存放的,即使用一段连续的存储空间来存储线性表的元素。

  2. 逻辑结构:顺序表是一种线性表,它的元素在逻辑上是依次排列的。

  3. 数据操作:顺序表支持基本的数据操作,包括插入、删除、查找等操作。其中,插入和删除操作需要移动大量元素,时间复杂度较高,而查找操作可以通过使用二分查找等算法来提高效率。

  4. 容量管理:顺序表的容量是由数组的长度来决定的。如果数组长度不够,顺序表需要进行扩容操作,如果数组长度过长,会浪费内存空间。

  5. 性能特点:由于顺序表的数据元素在内存中是连续存放的,所以顺序表具有快速的随机访问能力,但插入、删除操作较为耗时。因此,适合于需要随机访问元素,但不频繁进行插入、删除操作的场景。顺序表


如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。

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

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

相关文章

Win解答 | 解决键盘中 字母+空格 导致的输入法弹窗导致的一系列问题

近三个月来&#xff0c;一直都有一个键盘组合键的问题影响我的电脑使用&#xff0c;不管是打字还是打游戏&#xff0c;都会出现按键盘的 字母空格 弹出一个特殊符号的候选框&#xff0c;如下图所示 图片中为 S空格 所出现的弹窗 一个看似方便&#xff0c;实则难受的功能 其实打…

【AndroidStudio】java.nio.charset.MalformedInputException: Input length = 1

java.nio.charset.MalformedInputException: Input length 1 可以参考这个文章处理下编码格式&#xff1a;https://blog.csdn.net/twotwo22222/article/details/124605029java.nio.charset.MalformedInputException: Input length 1是因为你的配置文件里面有中文或者是你的编…

APEX内置验证与授权管理

参考博客&#xff1a;&#xff08;真的很好的教程&#xff0c;感谢&#xff01;&#xff09; 09技术太卷我学APEX-定制页面及导航菜单权限_白龙马5217的博客-CSDN博客https://blog.csdn.net/html5builder/article/details/128816236?spm1001.2014.3001.5501 1 应用程序安全性…

Git 安装、配置并把项目托管到码云 Gitee

错误聚集篇&#xff1a; 由于我 git 碰见大量错误&#xff0c;所以集合了一下&#xff1a; git 把项目托管到 码云出现的错误集合_打不着的大喇叭的博客-CSDN博客https://blog.csdn.net/weixin_49931650/article/details/132460492 1、安装 git 1.1 安装步骤 1.1.1 下载对应…

Linux系统编程:进程信号的处理

目录 一. 用户态和内核态 1.1 用户态和内核态的概念 1.2 用户态和内核态之间的切换 二. 信号的捕捉和处理 2.1 捕捉信号的时机 2.2 多次向进程发送同一信号 2.3 sigaction 函数 三. 可重入函数和不可重入函数 四. volatile 关键字 五. SIGCHLD信号 5.1 SIGCHLD信号的…

在互联网+的背景下,企业如何创新客户服务?

随着互联网的发展&#xff0c;开始数字化转型的潮流&#xff0c;移动互联网平台为各个行业带来了发展的新方向。企业有了移动互联网的加持&#xff0c;为客户提供了更好的服务。当移动互联网平台能够为客户提供更好的用户体验时&#xff0c;相应地&#xff0c;客户也给企业带来…

OpenCV项目开发实战--基于Python/C++实现鼠标注释图像和轨迹栏来控制图像大小

鼠标指针是图形用户界面 (GUI) 中的关键组件。没有它,您就无法真正考虑与 GUI 进行交互。那么,让我们深入了解 OpenCV 中鼠标和轨迹栏的内置函数。我们将演示如何使用鼠标来注释图像,以及如何使用轨迹栏来控制图像的大小 我们将使用下图来演示 OpenCV 中鼠标指针和轨迹栏功能…

Arcgis colorRmap

arcgis中colorRmap对应的名称&#xff1a; 信息来源&#xff1a;https://developers.arcgis.com/documentation/common-data-types/raster-function-objects.htm 点击该网页&#xff0c;并直接搜索“rasterFunction”&#xff0c;直接索引到该位置。 在arcpy中使用方法&#…

Linux安装jdk、mysql、并部署Springboot项目

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;Linux、环境安装、JDK安装、MySQL、MySQL安装☀️每日 一言&#xff1a;知行合一&#xff01; 文章目录 一、前言二、安装步骤2.1 安装JDK&#xff08;1&#xff09;创建文件夹&#xff08;便于后…

2828. 判别首字母缩略词

2828. 判别首字母缩略词 C代码1&#xff1a; bool isAcronym(char ** words, int wordsSize, char * s){if (wordsSize ! strlen(s)) {return false;} for (int i 0; i < wordsSize; i) { // 遍历所有&#xff0c;没有不满足的就是满足的if (words[i][0] ! s[i]) {return…

【C语言进阶(5)】指针笔试题(带图分析)

文章目录 笔试题 1笔试题 2笔试题 3笔试题 4笔试题 5笔试题 6笔试题7笔试题 8 分析下面代码的结果为何是这样 笔试题 1 1. 笔试代码 int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d\n", *(a 1), *(ptr - 1));return 0; }2.…

一文速学-让神经网络不再神秘,一天速学神经网络基础(一)

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

这才是教室巡课正确的打开方式,你做的太Low了!

随着教育领域不断演变和技术的不断进步&#xff0c;在线巡课系统正在逐渐引起人们的关注。通过实时观察教师的课堂教学&#xff0c;系统为教育管理者提供了窗口&#xff0c;使他们能够更深入地了解教学实践&#xff0c;从而更好地满足学生的学习需求。 在线巡课系统为教育管理者…

小梦C嘎嘎——启航篇】C++STL 中 list日常使用的接口介绍

小梦C嘎嘎——启航篇】CSTL 中 list日常使用的接口介绍&#x1f60e; 前言&#x1f64c;什么是list&#xff1f;常用的函数接口无参的构造函数接口拷贝构造接口赋值运算符重载 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&a…

Linux知识点 -- Linux多线程(三)

Linux知识点 – Linux多线程&#xff08;三&#xff09; 文章目录 Linux知识点 -- Linux多线程&#xff08;三&#xff09;一、线程同步1.概念理解2.条件变量3.使用条件变量进行线程同步 二、生产者消费者模型1.概念2.基于BlockingQueue的生产者消费者模型3.单生产者单消费者模…

如何创建「录取查询系统」?

随着高校招生规模的不断扩大&#xff0c;学校录取工作变得越来越繁琐。为了提高效率和准确性&#xff0c;许多学校开始采用电子化的录取查询系统。易查分作为一款功能强大的在线查询工具&#xff0c;可以帮助学校快速搭建自己的「录取查询系统」。 好消息&#xff01;博主给大家…

【C++代码】二分查找,移除元素

题目&#xff1a;二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 题解 在升序数组 nums \textit{nums} nums …

Linux安装mysql ( ARM架构,rpm包)

下载对应的mysql 阿里源&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 华为开源镜像站_软件开发服务_华为云 华为源&#xff1a; 华为开源镜像站_软件开发服务_华为云 选择华为鲲鹏镜像 https://repo.huaweicloud.com/kunpeng/yum/el/7/aarch64/ 下载mysql wg…

【3ds Max】练习——制作衣柜

目录 步骤 一、制作衣柜顶部 二、制作衣柜门板 三、制作衣柜底部 四、制作柜子腿部 五、制作柜子底板 步骤 一、制作衣柜顶部 1. 首先创建一个平面&#xff0c;然后将图片素材拖入平面 2. 平面大小和图片尺寸比例保持一致 3. 单机鼠标右键&#xff0c;选择对象属性 勾选…

简历考察点2_《CiCi-基于Vue3.0的智能音乐分享平台》

&#xff08;1&#xff09;项目初始化和推荐页面开发&#xff1a; 重点&#xff1a;轮播图、Scroll、下拉加载方法实现、 问题一&#xff1a;轮播图实现 ① 获取轮播图数据&#xff1a;虽然找到接口了&#xff0c;但是由于XHR请求在浏览器端会有跨域的限制&#xff0c;不能直…