数据结构之顺序表

顺序表详解 —— 初始化、销毁、打印、增加、删除、查找、修改 文章目录初始化顺序表销毁顺序表打印顺序表增加头插尾插删除查找修改 初始化顺序表 销毁顺序表 打印顺序表 增加 头插 尾插 删除 查找 修改 阅读详情

顺序表是数据结构里最基础的,今天分享关于顺序表的一些操作:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
因为顺序表又分为静态和动态,而静态的顺序表使用的是定长数组存储,而动态顺序表使用动态开辟的数组存储,生活中常常不知道数据规模的时候居多,需要使用的时候动态扩容,所以静态顺序表局限性更大。
下面就主要讲解动态顺序表:

1.首先定义一个动态顺序表

typedef struct SeqList{
	int * arr;           //定义一个指针指向动态开辟的数组
	int size;            //有效数据个数
	int capacity;        //容量空间大小
}SeqList;

2.下面是一些接口的实现

1.打印顺序表

void SeqListprint(SeqList *ps)
{
	if (ps->size == 0)
	{
		return;
	}
	for (int i = 0; i < ps->size; i++) //就是纯遍历一遍
	{
		printf("%d ",ps->arr[i]);
	}
}

2.顺序表扩容

static void CheckCapacity(SeqList *ps)
{    //实际长度小于最大容量则不需扩容
	if (ps->size < ps->capacity)
	{
		return;
	}
	//申请内存空间
	int NewCapacity = (ps->capacity) * 2;
	int* Newarray = (int*)malloc(sizeof(int)*NewCapacity);
	assert(Newarray != NULL);  //断言,申请失败则直接终止
	//把所有数字搬到新顺序表中
	for (int i = 0; i < ps->size; i++)
	{
		Newarray[i] = ps->arr[i];
	}
	//释放原来空间
	free(ps->arr);
	ps->arr = Newarray;
	ps->capacity = NewCapacity;
}

3.顺序表的初始化

void SeqListInit(SeqList *ps, int capacity)
{
	assert(ps != NULL);
	if (ps != NULL)
	{
		ps->arr = (int*)malloc(sizeof(int)*capacity);
		assert(ps->arr != NULL);
		ps->size = 0;
		ps->capacity = capacity;
	}
}

4.销毁顺序表

void SeqListDestroy(SeqList *ps)
{
	assert(ps != NULL);
	free(ps->arr);
}

5.顺序表的头插
时间复杂度O(n)

void SeqListPushFront(SeqList *ps, int v)
{
	CheckCapacity(ps);        //首先检查是否需要扩容
	for (int i = ps->size - 1; i >= 0; i--)
	{
		ps->arr[i + 1] = ps->arr[i];   //从后面一直到前面的元素每个一次向后挪一位
	} 
	ps->arr[0] = v;
	ps->size++;              //size++一定不要忘了
}

6.顺序表的尾插

void SeqListPushBack(SeqList *ps, int v)
{
	CheckCapacity(ps);          //检查是否需要扩容
	ps->arr[ps->size] = v;
	ps->size++;
}

7.根据pos下标插入
时间复杂度O(n)

void SeqListInsert(SeqList *ps, int pos, int v)
{
	CheckCapacity(ps);                   //检查是否需要扩容
	assert(pos >= 0 && pos <= ps->size); //pos=0就是头插,pos=size就是尾插
	for (int i = ps->size - 1; i >= pos; i--)  
	{
		ps->arr[i + 1] = ps->arr[i];  //最后一个元素一直到pos(包括pos)依次向后挪一位
	}
	ps->size++;
	ps->arr[pos] = v;
}

8.顺序表的尾删

void SeqListPopBack(SeqList* ps) 
{
	assert(ps->size > 0);
	ps->size--;
}

9.顺序表的头删
时间复杂度O(n)

void SeqListPopFront(SeqList *ps)
{
	assert(ps->size > 0);            //先判断是否有元素
	for (int i = 0; i <= ps->size - 2; i++)
	{
		ps->arr[i] = ps->arr[i + 1];   //第二个元素一直到最后一个元素依次向前挪一位
	}
	ps->size--;
}

10.在指定pos处删除元素
时间复杂度O(n)

void SeqListErase(SeqList *ps, int pos)
{
	assert(pos >= 0 && pos< ps->size);            //检查pos是否在有效范围内
	for (int i = pos; i <= ps->size - 2; i++)    
	{
		ps->arr[i] = ps->arr[i + 1];              //pos后的元素依次向前挪一位
	}
	ps->size--;
}

11.查找指定元素并返回下标

int SeqListFind(SeqList *ps, int v)
{
	assert(ps->size>0);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == v)
		{
			return i;
		}
	}
	return -1;
}

12.修改指定位置的元素

int SeqListModify(SeqList *ps, int pos, int v)
{
	assert(pos >= 0 && pos < ps->size);       //判断pos是否在有效范围内
	ps->arr[pos] = v;
	return 1;
}

13.删除第一个值为指定值的元素

void SeqListRemove(SeqList *ps, int v)
{
	int dis = SeqListFind(ps,v);    //首先查找是否有这个元素
	if (dis == -1)
	{
		return;
	}
	SeqListErase(ps, dis);
}

14.删除所有值为指定值的元素

//这是个比较巧妙的方法
void SeqListRemoveAll(SeqList *ps, int v)
{
	int i, j;
	for (i = 0, j = 0; i < ps->size; i++)
	{
		if (ps->arr[i] != v)           //定义i,j两个变量做下标
		{
			ps->arr[j] = ps->arr[i];   //arr[i]!=v则把arr[i]赋给arr[j]
			j++;                       //j每次记录的是值不为v的下标
		}
	}
	ps->size = j;                      //j即为最后顺序表的长度
}

3.小结

顺序表的大部分操作都如上所示,其中比较重要的就是顺序表的扩容,头插,尾插,头删,尾删,要真正理解他每个操作实现的过程,死记代码里的循环条件那是没用的,条件都是可以变的,顺序表的下标随机访问很方便,这是他的一大优点。

数据结构之顺序表:顺序表的结构及基本操作 目录一、数据结构1.1 算法与数据结构的区别二、顺序表2.1 顺序表的基本形式【重点】2.2 顺序表的两种基本实现方式【重点】1、一体式结构:2、分离式结构:2.3 元素存储区替换与扩充1. 元素存储区的替换2. 元素存储区的扩充2.4 顺序表的操作1. 增加元素2. 删除元素2.5 Python中的顺序表 一、数据结构 数据结构指数据对象中数据元素之间的关系。 计算机只有三种数据类型:int、float、char。存储在内存中,1个int占4个字节。 1.1 算法与数据结构的区别 程序 = 数据结构 阅读详情

相关推荐

2024广东省职业技能大赛云计算——集群部署GitLab

题目是这样的:在Kubernetes集群中新建命名空间gitlab-ci,将GitLab部署到该命名空间下,Deployment和Service名称均为gitlab,以NodePort方式将80端口对外暴露为30880,设置GitLab服务root用户的密码为admin@123,将项目包demo-2048.tar.gz导入到GitLab中并命名为demo-2048。GitLab是一个功能强大且灵活的 DevOps 平台,为开发团队和企业提供了从代码管理到持续集成、交付和部署的一整套解决方案。

kuuuugua的博客 4396

数据结构—顺序表的销毁

//顺序表的销毁 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define OK 1 #define OVERFLOW -2 #define LIST_INIT_SIZE 10// 线性表存储空间的初始分配量 typedef int Status; //Status是函数数据类型 ,其值是函数结果状态,如OK typedef ...

qq_39830449的博客 1万+

西门子S7-1200 PLC与伺服电机控制实战解析

工业自动化控制系统中,PLC(可编程逻辑控制器)与伺服电机的协同工作是实现精密运动控制的核心技术。通过PROFINET工业以太网协议,PLC可以高效地控制多台伺服电机,实现定位、同步和插补等复杂运动。在实际工程应用中,硬件组态的正确配置和运动控制算法的优化是关键挑战。本文以西门子S7-1200 PLC控制五台伺服电机的项目为例,详细介绍了从硬件组态、运动控制程序实现到HMI界面设计的全流程。特别针对多轴同步插补运动、动态速度曲线调整等特殊工艺需求,提供了实用的解决方案和调试技巧,为工业自动化领域的工程师提供

weixin_30252709的博客 497

数据结构系列学习(二) - 顺序表(Contiguous_List)

在计算机内部存储一张线性表(线性结构的数表),最为方便简单的就是用一组连续的地址的内存单元来存储整张线性表。这种存储结构称为顺序存储结构。这种存储结构下的线性表就称为顺序表。一张顺序表包括这几个特征:有一个唯一的表名来标识该顺序表;内存单元连续存储,也就是说一张顺序表必须要占据一块连续的内存空间;数据顺序存放,元素之间有先后关系;定义一张顺序表也就是在内存中开辟一段连续的存储空间,同时我们定义的顺序表也应该实现增删查改这四个功能。

曾铎的博客 4500

Cadence仿真数字电路功耗

Cadence仿真数字电路功耗 数字电路的功耗采用平均电流乘电源电压获得,所以本文的关键是测量平均电流。 仿真前设置好仿真参数后,在仿真的ADE街边选择:outputs➡to be saved➡select on design 选择电源的负端电流(若选择正端,则电流为负): 选择完成后,在ADE界面讲所选节点的plot也勾选上,点击run。仿真完成后自动显示波形。在波形上选中该电流曲线,右击选择:send to➡calculator 注意上图中,商店前的波形不稳定,需要进行截取。在calculator

qq_41519780的博客 1万+

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks6.9 + Workbench3.3的安装部署,以及简单示例项目的创建、编译和运行

Mr.Sugarcane 5463

顺序表的创建,销毁,查找,插入,删除

顺序表是一种数据结构,它采用线性存储方式将数据元素按照元素值的大小依次存储在一段连续的地址空间中。顺序表通过数组来实现,数组中的每个元素对应一个数据元素,通过数组下标可以方便地访问任意位置的数据元素。顺序表具有随机存取的特点,即可以快速地访问任意位置的数据元素。顺序表也具有插入和删除操作复杂度较高的缺点,因为当需要插入或删除某个位置的数据元素时,可能需要移动大量的元素来保持数组中元素的连续性。本文描述了顺序表的基本操作,顺序表的创建,销毁,查找,插入,删除

2201_75919511的博客 1418

OPTEE常见13类问题与解答

OPTEE常见13类问题并解答

AI-安全-功耗 1204

【C语言实现数据结构】顺序表

用C语言实现初阶数据结构中的顺序表,里面还有几道OJ题目

端端的博客 1937

自抗扰控制(ADRC)理论与工程实践:8.1 自适应ADRC与参数在线整定

自适应自抗扰控制(AADRC)针对传统固定参数ADRC在动态变化系统中的局限性,提出通过在线调整关键参数(如观测器带宽ω₀、控制器带宽ω_c)以适应对象动态变化。主要方法包括基于稳定性理论的自适应律设计和基于性能指标的优化调节,前者保证闭环稳定但设计复杂,后者通过梯度搜索或模糊规则实现性能优化但缺乏严格稳定性证明。当前挑战在于非线性时变系统的稳定性分析、参数变化速率限制及工程实现的计算负担。AADRC拓展了ADRC在变参数系统(如无人机、软体机器人)中的应用,是迈向自主智能控制的关键技术。

技术工作者 215

详解【异质图卷积网络 RGCN】回顾:图神经网络问题的三大处理步骤 | 从起源说起,RGCN核心公式解释,两种降低模型参数量/优化的方式,附核心代码实现讲解

本篇,我们深入分析和学习RGCN的原理以及为何要这么做。首先让我们来回顾对于图神经网络问题的三大处理步骤,可以说,这是该深度学习模型的基本理解,后续都是在深化其中的细节处理。然后以容易理解的方式,引出异质图卷积网络RGCN的由来,主要讲解其核心公式和论文中作者所提出的两种降低模型参数量/优化的处理办法,并给出基础分解以及块对角分解的核心实现代码讲解。最后附上RGCN源代码及说明。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1279

数据结构【顺序表】

我们需要创建一个seqlist.h头文件,seqlist.c文件存放函数,还有一个.c的测试文件。

qq_67578580的博客 2514

csp信奥赛C++标准模板库STL案例应用1

csp信奥赛C++标准模板库STL案例应用1

王老师青少年编程 1382

数据结构--顺序表

顺序表是数据结构中线性表的一种存储结构。它按逻辑顺序依次存储数据元素,在内存中占据连续空间。从概念分类上,可分为静态顺序表和动态顺序表。前者大小固定,后者能按需调整容量,它们都具有随机访问特性,利于高效查找元素。

2402_88461821的博客 1614

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【数据结构】顺序表

顺序表带你走进数据结构世界🎈

East-sunrise的博客 4718

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据结构——顺序表

本篇为数据结构系列的第一篇文章,数据结构是一种有效地存储和管理数据的方法,在应对实际问题时的重要性不亚于算法。本系列为我在学习数据结构后对于数据结构的理解,使用的语言为C。这里提几点建议,数据结构最重要的是思想,先有思路再进行代码还原能提高学习效率,在学习时,建议多画图辅助理解,图形能更直观地表达出数据结构。

m0_74310998的博客 2398

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【数据结构初阶】顺序表专题

动态顺序表的实现 增删查改

凤年徐的博客 2851

数据结构顺序表

/类型重命名,为了方便后续替换类型//定长数组int size;//顺序表当前有效的数据个数}sl;这里,我们使用了定长数组,那么它就存在一个缺陷,就是这个数组给大了,浪费空间,给小了,空间不够。//类型重命名,为了方便后续替换类型//指向动态开辟的数组int size;//顺序表当前有效的数据个数//顺序表空间可存储数据个数}sl;这里,我们使用指针类型,方便我们后续使用动态内存开辟函数来调整空间的大小。size:表示了顺序表里面存储了多少个有效数据。

2301_81291674的博客 1166

数据结构——顺序表专题

什么是数据结构呢?· 数据结构是由“数据”和“结构”两词组合⽽来。· 概念:数据结构是计算机存储、组织数据的⽅式。· 数据结构是指相互之间存在⼀种或多种特定关系的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么⽅式构成,以及数据元素之间呈现的结构。总结:1)能够存储数据(如顺序表、链表等结构)2)存储的数据能够⽅便查找。

optimistic_chen的博客 1543

数据结构初阶之顺序表

数据结构初阶之顺序表,很简单明了的解释和实现,相信大家看完之后一定会有所收获,刚入门的小伙伴们可不要错过哦!

2302_80214413的博客 1825

【数据结构】—— 顺序表

顺序表(Sequential List)是一种基本的数据结构,它通过一组连续的存储单元来存储具有相同类型的数据元素。

ElvInR的博客 1765
上一篇: linux之进程
下一篇: 数据结构之无头单向非循环链表
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值