【数据结构】——线性表(顺序表)——内有代码详解

news2025/1/12 20:46:19

目录

 一、引言

二、线性表

2.1 定义

2.2 特点 

三、顺序表

3.1 顺序表的概念

3.2 顺序表的特点 

 3.3 顺序表的定义

3.3.1 静态定义

3.3.2 动态定义

3.4 顺序表的初始化

 3.4.1 静态初始化

3.4.2 动态初始化 

 

3.5 顺序表的销毁

3.6 顺序表元素的打印

3.7 顺序表的插入

3.7.1 检查空间,如果满了,进行增容

3.7.2 尾插

3.7.3 头插

3.7.4 中间插入

3.8 顺序表的删除

3.8.1 尾删

检查

1 温柔判断

2 暴力判断 

 代码:

3.8.2 头删

3.8.3 中间删除

3.9 顺序表的查询

四、总结


 一、引言

我们学完了算法和算法效率的度量,接下来我们将进入线性表的学习了,也是数据结构较为重要的一部分,


二、线性表

2.1 定义

线性表(linear list):是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。

2.2 特点 

  • 表中元素的个数有限。
  • 表中元素具有逻辑上的顺序性,表中元素有其先后次序。
  • 表中元素都是数据元素,每个元素都是单个元素。
  • 表中元素的数据类型都相同,这意味着每个元素占有的相同大小的存储空间。
  • 表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容。

*线性表是一种逻辑结构 ,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构两者属于不同层次的概念,因此不可以混淆哦。


三、顺序表

下面我们就有进入线性表的顺序表示——顺序表的学习了。

3.1 顺序表的概念

顺序表是一种线性表的存储结构,它通过一组地址连续的存储单元来表示线性表的元素集合。顺序表中的元素按照逻辑顺序依次存放在存储单元中,可以通过元素的下标来访问和操作元素。顺序表可以是静态分配的,也可以是动态分配的。

3.2 顺序表的特点 

顺序表的优点是元素的访问速度快,可以随机访问任意位置的元素缺点是插入和删除操作需要移动大量的元素时间复杂度为O(n)。因此,适合于元素的频繁访问和较少的插入删除操作的场景。

 3.3 顺序表的定义

3.3.1 静态定义

假设现线性表的元素类型为SLDataType,数组最大长度为N

顺序表的静态定义:

typedef int SLDataType;//元素数据类型
#define N 100    //顺序表的最大长度

//静态顺序表
struct SeqList
{
	SLDataType a[N];//顺序表的元素
	int size;//表中数据长度
};

静态顺序表因为数组的大小和空间以及固定,一定长度定义太小就会导致数据溢出程序崩溃。

3.3.2 动态定义

但是动态顺序表就能解决,它在执行中一旦发现空间占满可以通过语句进行扩充空间大小或者开辟一段更大的空间用来存储。所以我们一般用动态定义。

顺序表的动态定义:

typedef int SLDataType;//元素类型
#define INIT_CAPACITY 4//表长的初始定义

//动态顺序表
typedef struct SeqList
{
	SLDataType* a;//动态分配数组的指针
	int size;     //表的长度
	int capacity; //表的空间容量
}SL;              //类型定义

 

3.4 顺序表的初始化

 3.4.1 静态初始化

因为静态定义时已经定义了数组的长度,因此只需要将顺序表长度设为0就行了

//静态初始化
SL s;           //声明一个顺序表
void SLInit(SL s)
{
	s.size = 0;
}

3.4.2 动态初始化 

动态分配的初始化为顺序表分配一个预定义的数组空间,并将顺序表的当前长度设为0

//动态初始化
void SLInit(SL* ps)
{
    assert(ps);//检验ps
	ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);//分配存储空间
	if (ps->a == NULL)//检验是否分配成功
	{
		perror("malloc fail");
		return;
	}
	ps->capacity = INIT_CAPACITY;//初始存储容量
	ps->size = 0;//表长初始为0
}

 

3.5 顺序表的销毁

void SLDestroy(SL* ps)
{
	free(ps->a);    //释放顺序表空间
	ps->a = NULL;    //防止野指针
	ps->capacity = ps->size = 0;//归0
}

3.6 顺序表元素的打印

void SLPrint(SL* ps)
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
}

 

3.7 顺序表的插入

3.7.1 检查空间,如果满了,进行增容

插入时,要保证内存足够用不能存在溢出,而我们在初始化时运用了malloc分配内存空间,当内存不够用时就可以用realloc进行扩容。

void CheckCapacity(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)//检查空间是否够用
	{
		SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ps->capacity * 2);
		//扩大内存空间
		if (tmp == NULL)//检验扩容是否成功
		{
			perror("realloc fail");
			return;
		}
		ps->a = tmp;//将顺序表指向扩容的空间
		ps->capacity *= 2;//空间容量随之扩大
	}

}

3.7.2 尾插

顾名思义就是从顺序表的最后插入数据:

void SLPushBack(SL* ps, SLDataType x)
{
    assert(ps);//检查指针
    CheckCapacity(ps);//扩容


	//ps->a[ps->size] = x;
	//ps->size++;

	ps->a[ps->size++] = x;//尾部插入数据
}

3.7.3 头插

顾名思义就是从顺序表的前面插入数据:

void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);//检查指针
    CheckCapacity(ps);//扩容

	int end = ps->size-1;//设置最后的数据位置
	while (end + 1)//数据整体后移
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;//头插
	ps->size++;//增加数据长度
}

3.7.4 中间插入

void SeqListInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);//检查pos范围
    CheckCapacity(ps);//扩容
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;

}

3.8 顺序表的删除

3.8.1 尾删

检查

尾删顺序表时可能会删除过头,所以我们要进行判断:

1 温柔判断

顾名思义如果删除过头了则安安静静的不执行本次删除:

	//温柔检查
	if (ps->size < 0)
		return;
2 暴力判断 

如果删除过头则会弹出弹窗提醒你:

	//暴力检查
	assert(ps->size > 0);

如同还会告诉你错误行: 

 代码:
void SLPopBack(SL* ps)
{
	//暴力检查
	assert(ps->size > 0);

	//温柔检查
	//if (ps->size < 0)
	//	return;

	ps->size--;//减少数组个数
}

 

3.8.2 头删

void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size > 0);//防止删减过头
	int begin = 0;
	while (begin < ps->size)
	{
		ps->a[begin] = ps->a[begin + 1];
		begin++;
	}
	ps->size--;
}

 

3.8.3 中间删除

void SeqListErase(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);//判断pos范围
	int begin = pos;
	while (begin < ps->size-1)
	{
		ps->a[begin] = ps->a[begin + 1];
		begin++;
	}
	ps->size--;

}

3.9 顺序表的查询


int SLFind(SL* ps, SLDataType x)
{
    assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return i;//找到就返回
		}
	}
	return -1;//没找到返回-1
}

四、总结

       经过观察我们也发现头插和尾插可以用中间插入表示;头删和尾删也可以用中间删除表示。而头插和头删的时间复杂度是O(N^2),刚好是插入和删除的最坏情况;尾插和尾删的时间复杂度为O(N),刚好是它们的最好情况所以改选什么知道了吗。

        顺序表仅仅是线性表的一种,而线性表也仅仅是数据结构的一种,接下来姜糖还会给大家带去更好的作品,大家记得一键三连呀,谢谢大家支持。

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

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

相关文章

眼精星票据识别系统,助您快速识别票据

有没有遇到过这样的情况&#xff1a;手头一堆票据、证件和卡片&#xff0c;看着就头疼&#xff0c;更别提一一整理成数据了。说真的&#xff0c;这简直就是个无尽的噩梦&#xff01;好在&#xff0c;现在有了眼精星票证识别系统&#xff0c;一切都变得轻松起来。记得上次&#…

Android 动态修改APP图标

文章目录 Android 动态修改APP图标定义activity-alias修改图标和App名监听APP前后台状态切换进入后台时切换修改图标和名字缺点 Android 动态修改APP图标 修改前&#xff1a; 修改后&#xff1a; 定义activity-alias 在 AndroidManifest.xml 中设置 activity-alias&#xff1…

python类与面向对象编程

⚠️⚠️⚠️本章后半部分难度激增&#xff0c;请一定认真学习⚠️⚠️⚠️ ⚠️⚠️⚠️本章后半部分难度激增&#xff0c;请一定认真学习⚠️⚠️⚠️ ⚠️⚠️⚠️本章后半部分难度激增&#xff0c;请一定认真学习⚠️⚠️⚠️ 上篇回顾&#xff1a; 上篇我们帮天下第一…

基于STM32开发的智能水族箱管理系统

目录 引言环境准备智能水族箱管理系统基础代码实现&#xff1a;实现智能水族箱管理系统 4.1 温度传感器数据读取4.2 水泵与加热器控制4.3 水位传感器数据读取4.4 用户界面与显示应用场景&#xff1a;水族箱管理与优化问题解决方案与优化收尾与总结 1. 引言 智能水族箱管理系…

从0到1实现一个自己的大模型,实践中了解模型流程细节

前言 最近看了很多大模型&#xff0c;也使用了很多大模型。对于大模型理论似乎很了解&#xff0c;但是好像又缺点什么&#xff0c;思来想去决定自己动手实现一个 toy 级别的模型&#xff0c;在实践中加深对大语言模型的理解。 在这个系列的文章中&#xff0c;我将通过亲手实践…

【OPENMV】学习记录 (持续更新)

一、基础知识 1 设置彩色&#xff0f;黑白&#xff1a; sensor.set_pixformat() 设置像素模式。 sensor.GRAYSCALE: 灰度&#xff0c;每个像素8bit。sensor.RGB565: 彩色&#xff0c;每个像素16bit。 2 设置图像大小&#xff1a; sensor.set_framesize() 设置图像的大小 sen…

day51 动态规划 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 动态规划 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金 &#xff0c;这里可能有同学疑惑&#xff0c;本题中只能买卖一次&#xff0c;持有股票之后哪还有现金呢&#xff1f; 其实一开始现…

解密智慧校园解决方案:赋能数字化教育的未来

在当今数字化时代&#xff0c;智慧校园解决方案正以惊人的速度改变着教育界的面貌。随着科技的快速发展&#xff0c;数字化教育已经逐渐成为现代教育的核心。智慧校园解决方案作为一个集技术、教育和创新于一体的综合性项目&#xff0c;为学校提供了许多机遇和挑战。本文将揭示…

期望18K,4年前端Cvte 视源股份一面挂

一面 1、自我介绍&#xff1f;毕业的时候一直在 xx 公司&#xff0c;你基本都在做什么项目&#xff1f; 2、你讲一下你主要负责哪一块的&#xff1f;balabala 3、你们的 json 是怎么定义组件间的联动的&#xff1f; 4、怎么确定区分两个 input&#xff1f; 5、你们是怎么触…

Vue3入门 - vue3相比于vue2的优点,及如何创建Vue3项目

目录 一、认识Vue3 1. Vue2 选项式 API vs Vue3 组合式API 2. Vue3的优势 二、使用create-vue搭建Vue3项目 1. 认识create-vue 2. 使用create-vue创建项目 3.熟悉项目和关键文件 一、认识Vue3 1. Vue2 选项式 API vs Vue3 组合式API <script>export default …

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑发用电相似性的海上风电中长期双边协商交易优化决策模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【CV算法工程师必看】作为一个图像算法工程师,需要会什么,要学哪些技术栈?

作为一个图像算法工程师,除了基本的编程技能和理论知识,还需要掌握一系列的技术栈。以下是详细的技能和技术栈分类: 编程语言 Python: 主要用于快速开发和原型设计。常用库:OpenCV、Pillow、NumPy、SciPy、Scikit-image、TensorFlow、PyTorch。C++: 高性能要求的项目中广…

使用Ollama+OpenWebUI部署和使用Phi-3微软AI大模型完整指南

&#x1f3e1;作者主页&#xff1a; 点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月6日23点50分 &#x1f004;️文章质量&#xff1a;96分 欢迎来到Phi-3模型的奇妙世界&#xff01;Phi-3是由微软…

零售数据分析围绕人、货、场分析了什么?

零售数据分析围绕人、货、场分析了什么&#xff1f;通过全面分析零售业务中的人、货、场三个核心要素&#xff0c;为零售商提供深入的市场洞察和业务优化建议。通过对客流量、商品销售、场地布局等数据的收集和数据可视化分析&#xff0c;帮助企业更好地了解消费者行为、商品销…

一起学大模型 - 一起动笔练习prompt的用法

文章目录 前言一、代码演示二、代码解析1. 导入所需的库和模块&#xff1a;2. 设置日志记录和初始化模型&#xff1a;3. 定义一个函数用于清理GPU内存&#xff1a;4. 定义一个继承自LLM基类的QianWenChatLLM类&#xff0c;并实现对话生成的逻辑&#xff1a;5. 示例代码的主体部…

【Linux】ip命令详解

Linux网络排查 目录 一、ip命令介绍 1.1 ip命令简介 1.2 ip命令的由来 二、ip命令使用帮助 2.1 ip命令的help帮助信息 2.2 ip命令对象介绍 2.3 ip命令选项介绍 三、查看网络信息 3.1 显示当前网络接口信息 3.2 显示网络设备运行状态 3.3 显示详细设备信息 3.4 查看…

【多模态】37、TextSquare | 借助 Gemini-Pro 通过四个步骤来生成高质量的文本问答数据

文章目录 一、背景二、方法2.1 Square-10M2.2 模型结构2.3 使用 Square-10M 进行有监督微调 三、效果3.1 实验设置3.2 Benchmark 测评 论文&#xff1a;TextSquare: Scaling up Text-Centric Visual Instruction Tuning 代码&#xff1a;暂无 出处&#xff1a;字节 | 华中科技…

大学生必备搜题神器app?分享3个软件和公众号,来对比看看吧 #媒体#其他#笔记

以下分享的软件提供了各种实用的功能&#xff0c;如数学公式计算、语文阅读辅助等&#xff0c;让大学生们在学习过程中更加高效和便利。 1.同声传译王 譬如我们在搜题或是浏览一些资料文档到时候&#xff0c;经常会访问到一些外文网页或文档&#xff0c;所以一款趁手的翻译工…

2024年四川省国家大学科技园申报条件对象和支持政策

2024年四川省国家大学科技园申报对象 国家大学科技园是以具有较强科研实力的大学为依托&#xff0c;将大学的综合智力资源优势与其它社会优势资源相结合&#xff0c;为高等学校&#xff08;以下简称为高校&#xff09;科技成果转化、高新技术企业孵化、创新创业人才培养、产学…

白酒:茅台镇白酒的丰富历史与文化传承

茅台镇&#xff0c;位于中国贵州省仁怀市&#xff0c;是中国著名的白酒产区&#xff0c;以其得天独厚的自然环境和与众不同的酿造工艺而闻名于世。作为茅台镇的白酒品牌之一&#xff0c;云仓酒庄豪迈白酒承载着丰富的历史与文化传承。 茅台镇的历史可以追溯到汉代&#xff0c;当…