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

前言

数据结构入门 — 顺序表详解
博客主页链接: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);  //要乘以2if (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.mzph.cn/news/55829.shtml

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

相关文章

32、启用 HTTP 响应压缩和编程式配置Web应用

★ 启用HTTP压缩 就是前端页面如果改动的比较多&#xff0c;那么响应就会比较慢&#xff0c;可以通过设置HTTP响应压缩来提高响应&#xff0c;如果前端改动少&#xff0c;那么就不需要启动这个响应压缩。 目的&#xff1a;为了提高HTTP响应数据在网络上的传输效率。▲ 设置如…

强化学习系列--时序差分学习方法(SARSA算法)

强化学习系列--时序差分学习方法&#xff08;SARSA算法&#xff09; 介绍示例代码 介绍 SARSA&#xff08;State-Action-Reward-State-Action&#xff09;是一种强化学习算法&#xff0c;用于解决马尔可夫决策过程&#xff08;MDP&#xff09;中的问题。SARSA算法属于基于值的…

R语言常用数学函数

目录 1. - * / ^ 2.%/%和%% 3.ceiling,floor,round 4.signif,trunc,zapsamll 5.max,min,mean,pmax,pmin 6.range和sum 7.prod 8.cumsum,cumprod,cummax,cummin 9.sort 10. approx 11.approx fun 12.diff 13.sign 14.var和sd 15.median 16.IQR 17.ave 18.five…

算法通关村第十六关——

LeetCode643给定n个整数&#xff0c;找出平均数最大且长度为k的连续子数组&#xff0c;并输出该最大平均数。 其中1<k<nums.length<105。 输入&#xff1a;[1,12&#xff0c;-5&#xff0c;-6,50,3]&#xff0c;k 4 输出&#xff1a;12.75 解释&#xff1a;最大平均…

DevOps系列文章 之 Python 基础

练习题答案 1. 数字配对 考点&#xff1a;字符串&#xff1a;str( )、整型数&#xff1a;int( )、浮点数&#xff1a;float( ) # 方法一 a 5 b int(input("请输入数字5&#xff1a;"))while True:if b a:breakb input("配对失败&#xff0c;请重新输入或点…

用Python写一个武侠游戏

前言 在本教程中&#xff0c;我们将使用Python写一个武侠类的游戏&#xff0c;大的框架全部搭好了&#xff0c;很多元素都可以自己添加&#xff0c;让游戏更丰富 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 -…

编码过程中需要注意哪些安全问题?

SQL 安全 注入式&#xff08;Inject&#xff09;攻击是一类非常常见的攻击方式&#xff0c;其基本特征是程序允许攻击者将不可信的动态内容注入到程序中&#xff0c;并将其执行&#xff0c;这就可能完全改变最初预计的执行过程&#xff0c;产生恶意效果。下面是几种主要的注入…

帆软报表系统获取管理员权限

子曰&#xff1a;“君子食无求饱&#xff0c;居无求安&#xff0c;敏于事而慎于言&#xff0c;就有道而正焉&#xff1a;可谓好学也已。” 漏洞实战 构造payload&#xff0c;访问漏洞url后台地址&#xff1a; /ReportServer?opfr_auth&cmdah_loginui&_161983254558…

155. 最小栈(中等系列)

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int…

基于安卓的考研助手系统app 微信小程序

&#xff0c;设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。HBuilder技术作为当前最流行的操作平台&#xff0c;自然也存在着大量的应用服务需求。 本课题研究的是基于HBuilder技术平台的安卓的考研助手APP&#xff0c;开发这款安卓的考研助手APP主要是为了…

Go【gin和gorm框架】实现紧急事件登记的接口

简单来说&#xff0c;就是接受前端微信小程序发来的数据保存到数据库&#xff0c;这是我写的第二个接口&#xff0c;相比前一个要稍微简单一些&#xff0c;而且因为前端页面也是我写的&#xff0c;参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…

解码Python JSON:从基础到高级,掌握使用的精髓

摘要&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;在Python中通过json模块可以方便地处理JSON数据。本文将从JSON的基础概念讲解开始&#xff0c;逐步深入介绍json模块的各种功能和用法&#xff0c;带您从入门到…

【2023】LeetCode HOT 100——矩阵

目录 1. 矩阵置零1.1 C++实现1.2 Python实现1.3 时空分析2. 螺旋矩阵2.1 C++实现2.2 Python实现2.3 时空分析3. 旋转图像3.1 C++实现3.2 Python实现3.3 时空分析4. 搜索二维矩阵 II4.1 C++实现4.2 Python实现4.3 时空分析1. 矩阵置零 🔗 原题链接:

在其他python环境中使用jupyter notebook

1、切换到目标python环境 activate 目标python环境 2、安装notebook内核包 pip install ipykernel 3、加环境加入到notebook中 python -m ipykernel install 目标python环境 4、切换到base环境 activate base 5、打开目标项目的对应盘 如果&#xff0c;项目在c盘&…

修复hive重命名分区后新分区为0的问题

hive分区重命名后&#xff0c;新的分区的分区大小为0 , 例如 alter table entersv.ods_t_test partition(dt2022-11-08) rename to partition(dt2022-11-21) ods_t_test 的2022-11-21分区大小为0。怎样修复 使用 msck repair table 命令来修复表的元数据&#xff0c;让hive重新…

sscanf、scanf使用

sscanf scanf sscanf是C语言中的一个函数&#xff0c;用于将字符串按照指定的格式解析并提取其中的数据。它的原型定义如下&#xff1a;c int sscanf(const char *str, const char *format, ...);其中&#xff0c;str是待解析的字符串&#xff0c;format是解析的格式字符串&…

华为OD-滑动窗口最大值

题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例一 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出…

【linux进程概念】

目录&#xff1a; 冯诺依曼体系结构操作系统进程 基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类组织进程查看进程 fork()函数 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺…

基于HarmonyOS ArkUI实现音乐列表功能

本节将演示如何在基于HarmonyOS ArkUI的List组件来实现音乐列表功能。 本文涉及的所有源码&#xff0c;均可以在文末链接中找到。 活动主页 华为开发者论坛 规则要求具体要求如下&#xff1a; 第1步&#xff1a;观看<HarmonyOS第一课>“营”在暑期•系列直播&#x…