数据结构————顺序表

news2024/10/6 2:21:40

1.线性表

(1).线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串...

(2).线性表在逻辑上是线性结构,也就是说连续的一条直线。但是在物理结构上并不是一定是连续的,线性表在物理上存储的,通常以数组和链表结构的形式存储。

目录

1.线性表

 2.顺序表

顺序表的初始化:

 顺序表的扩容:

 顺序表的尾插:

顺序表的头插:​编辑

顺序表的尾删:

顺序表的头删:​编辑

顺序表的最后处理:

 顺序表的指定位置插入:​编辑

 顺序表的指定位置删除:​编辑


 2.顺序表

顺序表是用一段物理连续的存储单元依次存储数据元素的线性结构,一般情况下采用的数组存储。在数组上完成数据的增删查改。

在这里,我将给大家讲动态顺序表是怎么实现的。

(1).我先定义了一个结构体,因为顺序表是具有相同特性的数据元素的有限列表。所以我用SeqListDateType来typedef 了,这样我们如果是double 或者float这样的类型的话,我们就只用改变宏这里一处。

(2).因为是动态的,所以我就用指针,size就代表了顺序表中有多少个元素,capacity代表了是有多少的空间。


#define SeqListDateType int

typedef struct SeqList
{
	SeqListDateType* arr;
	int size;
	int capacity;
}SeqList;


顺序表的初始化:

第一个函数就是度顺序表的初始化,这里我是直接把ps->arr置位了NULL,size和capacity一开始是0。


void SeqListInit(SeqList* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

 顺序表的扩容:

因为我们是实现动态的顺序表,所以我们要处理一下,当size和capacity相等的时候,有2种情况,一种情况:一开始为0的时候,第二种情况:当空间不够的时候

这里,我用三目来实现了,如果是一开始我就给了4个int大小的空间,如果是第二种情况的话我就用扩二倍的思想来处理。

void SeqListCheckCapacity(SeqList* ps)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SeqListDateType* tmp = (SeqListDateType*)realloc(ps->arr, newcapacity*sizeof(SeqListDateType)*2);
		if (tmp == NULL)
		{
			perror("realloc fail\n");
			exit(-1);
		}
		ps->capacity = newcapacity;
		ps->arr = tmp;
	}
}

 顺序表的尾插:

一开始,我们开辟了4个int大小的空间,所以size一开始是0,然后就插入,然后size++就可以实现了,不过在我们插入的时候我们要考虑扩容的问题,如果空间满了,是要扩容的。

void SeqListPushBack(SeqList* ps, int x)
{
	assert(ps);
	SeqListCheckCapacity(ps);
	ps->arr[ps->size] = x;
	ps->size++;
	//SeqListInsert(ps, ps->size,x);
}


顺序表的头插:

思路:可以用迭代的思路走,但我们想一想,如果是从前面迭代的话,就会形成对数据的覆盖,所以要从后面迭代走。

我定义了end指向了4的位置,然后4要到后面的位置去,然后end--,这样当我们迭代完,顺序表0的位置就空了出来,直接把数据插入进去就可以了。

void SeqListPushFront(SeqList* ps,int x)
{
	assert(ps);
	SeqListCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >=0)
	{
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}
	ps->arr[0] = x;
	ps->size++;
	//SeqListInsert(ps,0,x);
}

顺序表的尾删:

顺序表尾删更简单,直接让size--就可以实现了。因为,我们打印的数据就是size范围内的数据,size减了过后就没有这个数据了。

void SeqListPopBack(SeqList* ps)
{
	assert(ps);
	ps->size--;
	//SeqListErqse(ps, ps->size-1);
}


顺序表的头删:

思路:先定义一个begin来指向第一个位置,我们迭代让后面的数据覆盖掉前面的数据就可以了。最后size--就实现了顺序表的头删。

void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	int begin = 0;
	while (begin < ps->size - 1)
	{
		ps->arr[begin] = ps->arr[begin+1];
		++begin;
	}
	ps->size--;
	//SeqListErqse(ps, 0);
}

顺序表的最后处理:

我们直接free掉动态开辟的空间就可以了,然后把size和capacity置为0.

void SeqListDestory(SeqList* ps)
{
	free(ps->arr);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

 我们想一个问题,如果是在面试中,给了我们10分钟来实现顺序表,如果这样处理时间是不是可能不够呢??所以,我给大家带来另外2个函数,这样我们就可以复用这2个函数对顺序表的头插、尾插..就可以直接复用,大大节约了时间。话不多说,直接放码!!!

 顺序表的指定位置插入:

思路:假设pos=2,我定义了end来指向最后一个元素,只需要将最后一个元素往后移动一位,然后end--,这样就迭代了起来,最终就可以把pos的位置空出来,然后在pos位置插入想要的元素。

        

void SeqListInsert(SeqList* ps, int pos, int x)
{
	assert(pos <= ps->size && pos>=0);
	SeqListCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->arr[end+1] = ps->arr[end];
		end--;
	}
	ps->arr[pos] = x;
	ps->size++;
}

 顺序表的指定位置删除:

思路:删除的话,其实也是一个覆盖的过程,将pos+1的位置覆盖掉pos的位置,然后迭代,临界位置就是size-1的时候,最后size--就实现了对指定位置的删除。 

void SeqListErase(SeqList* ps, int pos)
{
	assert(pos >=0 && pos <= ps->size-1);
	int begin = pos+1;
	while (begin <= ps->size-1)
	{
		ps->arr[begin-1] = ps->arr[begin];
		begin++;
	}
	ps->size--;
}


这样,就可以用这两个元素来复用了!
尾插:尾插其实就是对顺序表最后的位置插入元素(注意,在最后一个位置插入的时候size已经++了,所以是ps->size)

SeqListInsert(ps, ps->size,x);

头插:头插就是对0的位置插入元素

SeqListInsert(ps,0,x);

尾删:尾删也是和尾插一样的,对最后的位置删除

SeqListErase(ps, ps->size-1);

头删:头删是对0的位置开始删除

SeqListErase(ps, 0);

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

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

相关文章

如何学习python数据分析?

Python数据分析基础全流程攻略如下&#xff08;适合初学、转岗、无编程基础小白&#xff0c;直接教学&#xff0c;没有额外链接&#xff09; 一、学习 针对数据分析模块&#xff0c;python学习的内容并非全都要学&#xff08;SQL也是如此&#xff09;&#xff0c;即不需要像程…

IT技术岗位应聘的关键技巧与准备方法

面试攻略&#xff1a; # 导入所需的模块 import pandas as pd import numpy as np# 定义一个函数&#xff0c;返回两个数字的和 def add_numbers(num1, num2):return num1 num2# 创建一个DataFrame data {"Name": ["Alice", "Bob", "Char…

新零售数字化商业模式如何建立?新零售数字化营销怎么做?

随着零售行业增速放缓、用户消费结构升级&#xff0c;企业需要需求新的价值增长点进行转型升级&#xff0c;从而为消费者提供更为多元化的消费需求、提升自己的消费体验。在大数据、物联网、5G及区块链等技术兴起的背景下&#xff0c;数字化新零售系统应运而生。 开利网络认为&…

微服务笔记---Nacos集群搭建

微服务笔记---Nacos集群搭建 Nacos集群搭建1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化 Nacos集群搭建 1.集群结构图 官方给出的Nacos集群图&#xff1a; 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理…

实现Aware接口使用Spring底层组件

实现Aware接口使用Spring底层组件 Aware接口的实现类 基于Component&#xff0c;通过Aware的实现类在容器创建之前将Spring底层的信息获取并使用。 例如&#xff1a; 获取应用上下文对象applicationContext的ApplicationContextAware获取该类的bean对象信息的BeanNameAware…

企业资产管理,这么用事半功倍!

在当今竞争激烈的商业环境中&#xff0c;有效地管理和追踪资产&#xff0c;对于实现高效运营、优化资源利用和降低成本至关重要。 资产管理系统的引入&#xff0c;不仅可以提高资产管理的透明度和准确性&#xff0c;还可以加强对资产生命周期的控制&#xff0c;从而使企业在日常…

Zabbix监控之分布式部署

文章目录 Zabbix监控之分布式部署zabbix proxy概述部署zabbix-proxy节点规划基础环境准备安装proxy以及数据库配置数据库添加服务端host解析修改zabbix-proxy配置文件启动代理服务器 zabbix页面(1)在zabbix页面添加代理(2)zabbix-agent连接proxy Zabbix监控之分布式部署 zabbi…

Django校园宿舍管理系统【纯干货分享,免费领源码】

摘 要 本论文主要论述了如何使用django开发一个校园宿舍管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校园宿舍管理系统的当前背景以及系统开发的目的…

脑电信号处理与特征提取——1. 脑电、诱发电位和事件相关电位(胡理)

目录 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 1.2 经典的ERPs成分及研究 1.2.1 ERPs命名规则及分类 1.2.2 常见的脑电成分 1.2.3 P300及Oddball范式 1.2.4 N400成分 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 EEG(Electroencephalogram)&#x…

爬虫001_Pip指令使用_包管理工具_pip的使用_和源的切换---python工作笔记019

scrapy是一个爬虫的框架 确认一下pip这个python中的包管理工具是否已经安装好了 python的环境变量配置完了以后,还需要配置一下pip的环境变量 把这个目录配置好,这个pip的环境变量的配置很简单不多说了. 我们用pip安装一下包,我们安装到上面这个路径里面,就是python的安装路…

生态系统模型:SolVES、DNDC、CMIP6、GEE林业、APSIM、InVEST、META分析、文献计量学、无人机遥感、ArcGIS Pro模型等

【原文链接】&#xff1a;【科研必备软件教程】气象、生态、遥感、水文、洪水、语言、人工智能、地质等领域模型应用https://mp.weixin.qq.com/s/KgSvl20fIjTY0ZWDyF0-8A 【目录】&#xff1a; R语言在生态环境领域中的实践技术应用 CENTURY模型实践技术应用与案例分析 生态…

docker 禅道 不使用自建数据库 使用自定义数据库

网上关于docker 禅道使用非自带数据库资料好少&#xff0c;所以记录下&#xff0c;希望能帮助更多的人。 据说&#xff1a; 其他镜像都是内置了数据库&#xff0c; 如果使用外置的数据库&#xff0c;可以使用这个镜像 ​easysoft/quickon-zentao ​ 以上未知真伪&#xff…

视频的音频提取怎么做?这样提取很简单

提取视频中的音频通常在需要从视频中独立使用音频或需要对音频进行编辑时使用。例如&#xff0c;当我们需要将音频上传到音乐流媒体平台或将其用于播客或其他音频项目时&#xff0c;就可能需要从视频中提取音频。问题是该怎么提取呢&#xff1f;教给大家几种简单的提取方法&…

K8S系统监控:使用Metrics Server和Prometheus

Kubernetes 也提供了类似的linux top的命令&#xff0c;就是 kubectl top&#xff0c;不过默认情况下这个命令不会生效&#xff0c;必须要安装一个插件 Metrics Server 才可以。 Metrics Server 是一个专门用来收集 Kubernetes 核心资源指标&#xff08;metrics&#xff09;的…

电压放大器具体要求是什么

电压放大器是一种常见的电路结构&#xff0c;用于将输入信号放大成输出信号。在实际应用中&#xff0c;电压放大器需满足多个方面的要求&#xff0c;以确保其性能和稳定性。下面安泰电子将详细介绍电压放大器的具体要求。 1.放大器的增益 电压放大器的主要功能之一是对输入信号…

python求列表的交集、并集、差集

有这样一个场景&#xff0c;线上有一些生效的策略判断哪些是作弊订单&#xff0c;你通过数据挖掘挖掘了一些特征也判断了一些作弊订单&#xff0c;现在需要下你挖掘出来的特征的效果&#xff0c;那么主要关注两方面&#xff1a; &#xff08;1&#xff09;你的特征对于作弊订单…

QT字节数组类QByteArray

QT字节数组类QByteArray 初始化访问某个元素截取字符串获取字节数组的大小数据转换与处理Hex转换数值转换与输出 字母大小写转换字符串数值转化为各类数值QBQyteArray和char*互转QByteArray 和std::string互转与字符串QString互转QByteArray和自定义结构体之间的转化判断是否为…

【人工智能】对研究方法,智能模拟,学科范畴,涉及学科,研究范畴,安全问题,实现方法,人工智能与人类差距等方面的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Qt Core学习日记——第五天QMetaProperty

QMetaProperty代表类的属性 用Q_PROPERTY在类中声明属性 在moc会有具体变量名称字符串 函数分析&#xff1a; QMetaProperty::isEnumType 判断这个属性是否是枚举。 QMetaProperty::enumerator 获取属性对应的枚举信息&#xff0c;如果不是枚举返回未定义的QMetaEnum QMetaPr…

关于 Qt在windows使用mingw32编译器时从Qt5.9切换至Qt5.12出现“C2001:常量中有换行符“不修改编码 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131901444 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…