【探索数据结构】线性表之顺序表

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌

🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨

🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞

📝专栏指路:

📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。

📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

前言

初步认识了数据结构后,我们一起来探索它的逻辑结构里面的线性结构吧。线性结构是一对一的关系。线性表在逻辑结构上是连续的,在物理结构上不一定是连续的。线性表中的顺序表(本篇的主角)在物理结构上是连续的,而线性表中的链表在物理结构上却是不连续的。

一、线性表

线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。

几个概念:

1.ai是线性表中的“第i个”元素线性表中的位序(位序从1开始,注意区分数组下标从0开始

2.a1是表头元素;an是表尾元素。

3.除第一个元素外,每个元素有且仅有一个直接前驱(前一个元素);除最后一个元素外,每个元素有且仅有一个直接后继(后一个元素)

9d59d7f954594b72b79f785bc43c8078.png

二、顺序表

正片开始!

1.概念

顺序表——用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。顺序表的底层是数组。

9d44e91b48c64bed94713f95e628031c.jpg

2.静态顺序表

顺序表的空间大小固定

补充:为了简化代码,我们使用typedef 重命名自定义类型,typedef的优势是什么?

在C或C++中,typedef 关键字用于为已存在的数据类型定义一个新名称(别名)。这在需要简化复杂的数据类型声明,或者为特定的数据类型提供一个更有描述性的名称时非常有用。

代码如下:

typedef int SQLDataType;//顺序表的数据类型
//静态顺序表
typedef struct SeqList
{SQLDataType arr[100];int size;//有效数据个数int capacity;//空间大小
}SL;

3.动态顺序表

顺序表的大小空间不固定,可根据需求改变。

当顺序表存满时,用realloc增容。

typedef int SQLDataType;//顺序表的数据类型
//动态顺序表
typedef struct SeqList
{SQLDataType* arr;int size;//有效数据个数int capacity;//空间大小
}SL;

补充:realloc扩容的规则是什么?

一次扩充一个空间 ,插入一个元素还不会造成空间浪费程序(执行效率低下)

一次扩容固定个大小的空间(10、100…)【小了造成频繁扩容】【大了造成空间浪费】

最优解:成倍数的增加(1.5倍、2倍),数据插入的越多扩容的大小越来越大

扩容后会自动把原有空间释放掉

82685d545a784ea69d837396cae09657.png

malloc,realloc,calloc三者区别是什么?

  • malloc函数:用于动态分配指定字节数的内存空间,并返回一个指向它的指针。如果分配成功,则返回非空指针;如果内存空间不足,则返回NULL。需要注意的是,malloc分配的内存空间并未初始化,它们的值是未知的。
  • calloc函数:也用于动态分配内存空间,与malloc有所不同。calloc在分配内存空间时,会将其初始化为0。它的参数是要分配的元素个数和每个元素的大小,而不是总的字节数。如果分配成功,则返回指向分配的内存的指针;如果失败,则返回NULL。
  • realloc函数:用于调整之前分配的内存空间大小。它接收一个指向已分配内存的指针和一个新的大小,然后尝试调整内存块的大小。如果成功,则返回指向新的内存块的指针;如果失败,则返回NULL,而原来的内存块保持不变。

代码示例

//是否需要申请空间
void SQLcapacity(SL* ps)
{if (ps->capacity == ps->size)//空间已满,需要申请空间{//realloc增容,一般增加成原本空间大小的二或三倍int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SQLDataType* tmp = (SQLDataType*)realloc(ps->arr, newcapacity * sizeof(SQLDataType));if (tmp == NULL){perror("reacoll fail!");//空间申请失败exit(1);//退出程序}ps->arr = tmp;ps->capacity = newcapacity;}
}

4.对顺序表的操作

(1)初始化

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

(2)尾插

d934bfbb346e4a638f70d2beca95b97c.png

void PushBackSql(SL* ps, SQLDataType x)
{assert(ps);//插入之前先看空间够不够SQLcapacity(ps);ps->arr[ps->size++] = x;//size是顺序表尾部,后置++插入x后size加一
}

(3)头插

124e19006b51471aaab9c905f9ade1b9.png

//头部插入
void PushHeadSql(SL* ps, SQLDataType x)
{assert(ps);//插入之前先看空间够不够SQLcapacity(ps);//让原本的数据往后移一位for (int i = ps->size;i > 0;i--){ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]让arr[1]的位置放入原本arr[0]的数据}ps->arr[0] = x;ps->size++;
}

(4)查找

//查找指定数据
int FindPosSql(SL* ps, SQLDataType x)
{assert(ps);for (int i = 0;i < ps->size;i++){if (ps->arr[i] == x)return i;}return -1;
}

找到了返回下标,找不到则返回不存在的下标

(5)尾删

//尾部删除
void DelBackSql(SL* ps)
{assert(ps);assert(ps->size);//顺序表为空时不能执行删除操作ps->size--;
}

(6)头删

b688a74378ed4dc88226fa9a969ee07a.png

//头部删除
void DelHeadSql(SL* ps)
{assert(ps);assert(ps->size);//顺序表为空时不能执行删除操作//顺序表存放数据整体往前挪一位for (int i = 0;i < (ps->size) - 1;i++){//arr[0]的位置放原本arr[1]的数据,最后是ps->arr[size-2]=ps->arr[size-1]ps->arr[i] = ps->arr[i + 1];//arr[0]的位置放原本arr[1]的数据,最后是ps->arr[size-2]=ps->arr[size-1]}ps->size--;
}

(7)在指定位置之前插入数据

89b960a539204d2c8b747945b29a0b28.png

//指定位置前插入
void AddPosSql(SL* ps, int pos, SQLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//先看看空间够不够SQLcapacity(ps);//pos位置上的数和他后面的数整体往后挪一位for (int i = ps->size;i > pos;i--){ps->arr[i] = ps->arr[i - 1];//结束arr[pos+1]=arr[pos];}ps->arr[pos] = x;ps->size++;
}

(8)在指定位置删除数据

38e8eb6590294644a348f55083f5ab38.png

//删除指定位置数据
void DelPosSql(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//整体往前挪一位for (int i = pos;i < ps->size - 1;i++){ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]}ps->size--;
}

(9)销毁

//销毁顺序表
void DestroySql(SL* ps)
{if (ps->arr)//不是空表才需要释放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

顺序表小结

a13c2e0f17464d7abd5d2d6220e6a887.png

下一篇预告:线性表之单链表

持续更新中...

敬请期待

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

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

相关文章

Vue3按顺序调用新增和查询接口

Vue3按顺序调用新增和查询接口 一、前言1、代码 一、前言 如果你想将两个调用接口的操作封装在不同的方法中&#xff0c;你可以考虑将这两个方法分别定义为异步函数&#xff0c;并在需要时依次调用它们。以下是一个示例代码&#xff1a; 1、代码 <template><div>…

丰田精益生产的模板

丰田精益生产&#xff0c;也被称为丰田生产方式&#xff08;Toyota Production System, TPS&#xff09;&#xff0c;是一套完整的生产和管理系统&#xff0c;其核心目标是最大化效率、消除浪费&#xff0c;并通过持续改进来提升产品质量。 学习优秀企业 学习福特 丰田精益生产…

C语言之函数指针(持续更新)

C语言精髓是指针&#xff0c;指针知识深似海&#xff0c;遇到一些学习一些~ 文章目录 1. typedef 定义函数指针类型2. void* 空指针的解引用 1. typedef 定义函数指针类型 函数参数化是指通过函数指针将函数的某些行为参数化。这样&#xff0c;我们可以在调用函数时动态地指定…

【每日刷题】Day48

【每日刷题】Day48 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 872. 叶子相似的树 - 力扣&#xff08;LeetCode&#xff09; 2. 114. 二叉树展开为链表 - 力扣&…

react中怎么为props设置默认值

在React中&#xff0c;你可以使用ES6的类属性&#xff08;class properties&#xff09;或者函数组件中的默认参数&#xff08;default parameters&#xff09;来定义props的默认值。 1.类组件中定义默认props 对于类组件&#xff0c;你可以在组件内部使用defaultProps属性来…

如何撰写EI会议的投稿信?

撰写EI会议的投稿信&#xff08;Cover Letter&#xff09;是向会议组织者介绍你的论文和研究工作的一个重要环节。以下是撰写投稿信的一些关键步骤和建议&#xff1a; 投稿信的结构 信头 你的信息&#xff1a;包括姓名、职位、单位名称、通讯地址、电子邮件和电话号码。日期&am…

力扣652. 寻找重复的子树

Problem: 652. 寻找重复的子树 文章目录 题目描述思路复杂度Code 题目描述 思路 1.利用二叉树的后序遍历将原始的二叉树序列化&#xff08;之所以利用后序遍历是因为其在归的过程中是会携带左右子树的节点信息,而这些节点信息正是该解法要利用的东西&#xff09;&#xff1b; 2…

js积累二(web页面实现 时间走秒)

<tr><td class"ys04"><span class"ys02">当前时间&#xff1a;</span></td><td colspan"2"><span class"showTime"></span><script>var t null;t setTimeout(time, 1000); /…

【ai】chatgpt的plugin已经废弃

发现找不到按钮,原来是要申请: https://openai.com/index/chatgpt-plugins/ 发现申请已经跳转了,好像是废弃了? 不接受新插件了,但是openai的api 是可以继续用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…

Windows11的这个地方暴露着你的隐私,把它关掉避免尴尬

前言 现在的电脑真的是越来越智能化&#xff01;现在有很多小伙伴都是用着Windows11的吧&#xff01;用习惯了Windows11之后&#xff0c;突然发现它还是挺顺手的。 但不知道你有没有发现&#xff0c;Windows11上面有个地方暴露着你的隐私。这个隐私可能是某个小姐姐的图片&am…

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 在HTML中&#xff0c;如果使用一些特定的属性名&#xff08;如id或name&#xff09;给DOM元素命名&#xff0c;这些属性会在全局作用域中创建同名的全局变量&#xff0c;指向对…

算法:最大连续子序列和

53. 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 class Solution:def maxSubArray(self, nums: List[int]) -> int:a…

Vue $nextTick作⽤是什么怎么使用

Vue中的$nextTick是一个非常重要的方法&#xff0c;主要用于在DOM更新后执行延迟回调。其工作原理基于Vue的异步更新队列机制。 当你在Vue实例上修改数据后&#xff0c;Vue并不会立即更新DOM&#xff0c;而是将这些修改操作推入一个队列中&#xff0c;并在下一个事件循环的“t…

Shell | shell脚本中使用cp指令(外两则)

sample"ENCFF253NIN" #等号两侧避免使用空格 source_path"/home/xxzhang/workplace/project/CRISPRa/Pacbio/CCS_TE.2/" target_path"./" cp "$source_path"/00-common_all.vcf.gz "$target_path" cp "$source_path&qu…

如何在Python中实现迭代器和可迭代对象

在Python中&#xff0c;可迭代对象&#xff08;iterable&#xff09;是一个对象&#xff0c;它可以返回一个迭代器&#xff08;iterator&#xff09;用于遍历其元素。迭代器是一个对象&#xff0c;它有一个 __next__() 方法&#xff08;在Python 2中&#xff0c;它是 next() 方…

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码 1、用户管理1.1、添加用户1.2、编辑用户1.3、关联通道1.4、重置密码1.5、搜索1.6、删除 2、搭建GB28181视频直播平台 1、用户管理 1.1、添加用户 添加用户&#xff0c;可以配置登陆用户…

STM32-按键控制LED

接上篇LED点亮;http://t.csdnimg.cn/9r6z7 目录 一.硬件设计 二.软件设计 三.完整代码 四.结束语 一.硬件设计 按钮接电源插入PB0引脚,如上图所示 二.软件设计 void key_init() {GPIO_InitTypeDef GPIO_InitStruct;//使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO…

【LeetCode:496. 下一个更大元素 I + 单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

问题解决记录1:nvidia-container-cli: initialization error: load library failed

本地docker运行 $ docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi 遇到这种报错 Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error dur…

案例分享|Alluxio在自动驾驶模型训练中的应用与部署

分享嘉宾&#xff1a; 杨林三-辉羲智能 关于辉羲智能&#xff1a; 辉羲智能致力打造创新车载智能计算平台&#xff0c;提供高阶智能驾驶芯片、易用开放工具链及全栈自动驾驶解决方案&#xff0c;运用独创性“数据闭环定义芯片”方法学&#xff0c;助力车企构建低成本、大规模和…