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

目录

 一、引言

二、线性表

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);//检验psps->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.mzph.cn/news/849093.shtml

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

相关文章

Golang | Leetcode Golang题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; func candy(ratings []int) int {n : len(ratings)ans, inc, dec, pre : 1, 1, 0, 1for i : 1; i < n; i {if ratings[i] > ratings[i-1] {dec 0if ratings[i] ratings[i-1] {pre 1} else {pre}ans preinc pre} else {decif dec…

前端面试项目细节重难点(已工作|做分享)想(八)

面试官&#xff1a;请你讲讲你在该项目中遇到的印象深刻的问题是什么&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路进行阐述】 第一层面…

JSONPath使用指南(掌握JSON数据提取)

大家好&#xff0c;在处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据时&#xff0c;有时需要从复杂的结构中提取特定部分。JSONPath 就是一个非常有用的工具&#xff0c;它提供了一种简洁而强大的方式来定位和提取 JSON 数据中的元素。无论是在 Web 开发中处…

Linux-桌面操作系统在服务器上未关闭休眠机制,使其开机半小时左右死机无法远程ssh连接

故障表述 操作系统:ubuntu desktop 18.04 异常描述:开机半小时左右死机 1、登录iBMC查看硬件无异常 2、登录ubuntu desktop 18.04操作系统,导出日志文件syslog、dmesg、lastlog(路径:/var/log),操作系统在11月8号~11月9号之间出现异常 经分析操作系统日志文件,操作系…

【设计模式】策略模式(行为型)⭐⭐

文章目录 1.概念1.1 什么是策略模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了策略模式4. Spring 哪些地方用到了策略模式 1.概念 1.1 什么是策略模式 它允许用户在不修改现有对象的代码的情况下向对象添加新的功能&#xff1b;这种模式是通过创建一个包含该对象的包装…

OpenStack云平台管理

OpenStack云平台管理 文章目录 OpenStack云平台管理资源列表基础环境一、部署Openstack二、创建网络和路由2.1、删除默认的网络2.2、创建网络和路由2.2.1、创建外部网络2.2.2、创建内部网络 2.3、创建路由 三、创建实例3.1、配置实例3.2、配置NAT转换 四、绑定浮动IP地址五、添…

【TB作品】MSP430F149 单片机 音乐喷泉

功能 声音越大&#xff0c;亮的灯越多。 oled显示出当前的声音大小。 硬件接线 //OLED----MSP430 //VCC-----3.3V //GND-----GND //D0------P3.2 //D1------P3.0 //RES-----P2.0 //DC------P2.2 //CS------P8.1 led P4八个引脚 adc P6.0 部分代码 _EINT();while (1){adok…

函数柯里化:Python中的高级编程技巧

函数柯里化&#xff1a;Python中的高级编程技巧 在Python编程中&#xff0c;柯里化&#xff08;Currying&#xff09;是一种将一个多参数的函数转换成多个单参数函数的技术。这种技术起源于数学逻辑学&#xff0c;由数学家Haskell Curry提出&#xff0c;因此得名。在函数式编程…

ES6+-函数的双重用途,语法层面上判断函数的调用方式

函数可以被当作普通函数使用&#xff0c;也可以当作构造函数使用new关键字调用&#xff0c;有时候我们编写一个函数明确就是用来当做构造函数的&#xff0c;可无法限制其他人对此函数的调用方式。如下&#xff1a; function Person (name, age) {this.name namethis.age age…

上位机图像处理和嵌入式模块部署(f407 mcu中的项目开发特点)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和soc相比较&#xff0c;mcu的项目规模一般不算大。因为&#xff0c;soc项目中&#xff0c;从规划、硬件开发、驱动、应用端、服务器端到测试&…

举个栗子!Quick BI 技巧(8):柱形图的制作及应用

众所周知&#xff0c;在数据分析中&#xff0c;柱形图是利用率非常高的一种图&#xff0c;主要是用于比较各组数据之间的差别&#xff0c;并且可以显示一段时间内的数据变化情况。那么在 Quick BI 中要如何来制作柱形图呢&#xff1f; 今天的栗子&#xff0c;我们就来分享如何…

RocketMq生产常见问题及解决方案(三) 顺序消息和消息堆积的解决法方式

1.rocketmq中的顺序消息 1.1 rocketmq顺序消息的使用场景 顺序消息分为全局顺序消息和局部顺序消息&#xff0c;在增量同步日志的时候&#xff0c;需要保证消息全局有序&#xff0c;这个时候&#xff0c;我们需要全局顺序消息。而在订单业务常见的一个场景是&#xff0c;每个…

【Redis】Redis事务详解

Redis的事务&#xff08;transaction&#xff09;允许在一个单独的操作序列中执行多个命令&#xff0c;并保证这些命令在其他客户端无法中断的情况下执行。Redis通过MULTI、EXEC、DISCARD和WATCH命令来实现事务管理。 Redis事务的基本命令 MULTI&#xff1a;开启一个事务块。…

【Android面试八股文】String s= new string(“xxx“); 创建了几个String对象?

String s= new string(“xxx”);创建了几个String对象? 这道题想考察什么 ? 这个问题旨在考察对于 Java 中字符串 String 的理解。 考察的知识点 Java基础,JM常量池与对象内存分配 考生应该如何回答 首先让我们来分析代码 String s = new String("xxx")。 …

DP:子序列模型

子数组vs子数列 1、子数组&#xff08;n^2&#xff09; 子序列(2^n) 2、子数组是子序列的一个子集 3、子数组必须连续&#xff0c;子序列可以不连续 一、最长递增子序列 . - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 1、状态表示&#xff…

数据管理积重难返?这有一个新药方丨直播预告

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数智化转型的浪潮中&#xff0c;数据管理领域正面临着前所未有的挑战和机遇。企业在数据管理过程中&#xff0c;普遍遭遇数据孤岛、数据质量不佳、存储和处理成本高昂、数据安全与隐私保护压力以及多源异构数据整合困难等诸多…

【MMU】——MMU 页命中/缺页

文章目录 MMU 页命中/缺页MMU 命中MMU 缺页 MMU 页命中/缺页 MMU 命中 处理器产生一个虚拟地址。MMU生成 PTE 地址&#xff0c;并从高速缓存/主存请求得到它。高速缓存/主存向 MMU 返回 PTE。MMU 构造物理地址&#xff0c;并把它传送给高速缓存/主存。高速缓存/主存返回所请求…

GIT仓库发布提交

git config --global user.name "test" git config --global user.email "testqq.com" 创建 git 仓库:mkdir php_tuisong cd php_tuisong git init touch README.md git add README.md git commit -m "first commit" git remote add origin htt…

SpringBoot引入WebSocket依赖报ServerContainer no avaliable

1、WebSocketConfig 文件报错 Configuration EnableWebSocket public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}2、报错内容 Exception encountered during context initialization - canc…

SpringBoot+Vue校园管理系统(前后端分离)

技术栈 JavaSpringBootMavenMyBatisMySQLVueElement-UIShiro 系统角色 管理员用户院系管理员 系统功能截图