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

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对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,一经查实,立即删除!

相关文章

丰田精益生产的模板

丰田精益生产&#xff0c;也被称为丰田生产方式&#xff08;Toyota Production System, TPS&#xff09;&#xff0c;是一套完整的生产和管理系统&#xff0c;其核心目标是最大化效率、消除浪费&#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…

【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;指向对…

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;助力车企构建低成本、大规模和…

设计模式5——抽象工厂模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 抽象工厂模式&#xff08;Abst…

每日5题Day8 - LeetCode 36 - 40

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 题目要求我们进行判断&#xff0c;我们不需要自己填写&#xff0c;所以要一个标志位&#xff0c;来看当…

Go源码--sync库(1)sync.Once和

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

首个“软件供应链安全”国家标准正式发布!ToB企业震荡,影响90%开发者

​近日&#xff0c;由开源网安深度参与编制的GB/T 43698-2024《网络安全技术 软件供应链安全要求》和GB/T 43848-2024《网络安全技术 软件产品开源代码安全评价方法》两项国家标准正式发布。 GB/T 43698-2024《网络安全技术 软件供应链安全要求》&#xff0c;是国内首个面向软件…

Linux .eh_frame section以及libunwind

文章目录 前言一、LSB二、The .eh_frame section2.1 简介2.2 The Common Information Entry Format2.1.1 Augmentation String Format 2.3 The Frame Description Entry Format 三、The .eh_frame_hdr section四、libunwind五、基于Frame Pointer和基于unwind 形式的栈回溯比较…

双向链表C++,C#,Java版,这些程序大多已经过测试,一直在用。

先C版吧&#xff0c;我最先用的是C#,后来是Java&#xff0c;后来改用C版的&#xff0c;因为现在一直在用C&#xff0c;单链 表一直没写上去&#xff0c;因为我很少用&#xff0c;用的是双链表。 执行代码例子1&#xff1a; int main() { _DList<_string> s…

9.STL中list的常见操作(图文并茂)

目录 1.list的介绍及使用 1.1.list的构造 1.2 list iterator的使用 1.3. list capacity 1.4.list modifiers 1.5.list的迭代器失效 1.list的介绍及使用 list介绍 &#xff0c;可以通过以下图直观的感受到 vector 和 list 的区别 Vector 插入代价高&#xff0c;但便于排…