实现顺序表的增删查改

现在让我们探索数据结构这个美妙的世界吧!

概念介绍

线性表是具有相同特性的数据元素的有限序列。线性表是一种在实际运用中广泛运用的线性结构,如线性表,栈,队列,字符串等。

顺序表的本质是数组,实现了对数组的封装,例如增删查改等功能。

顺序表分为静态顺序表和动态顺序表:

静态顺序表:

#define N 100
struct SeqList
{int arr[N];int size;//有效数据个数
};

动态顺序表:

struct SeqList
{int* arr;//动态数组int size;//有效数据个数int capacity;//空间大小
};

但是目前这个结构体只能存储int类型的数据,所以我们给数据类型起一个别名,让其更好存储其他类型的数据。

我们当前顺序表存储的类型进行替换:

typedef int SLDataType;

当前顺序表被我们修改成这样:

struct SeqList
{SLDataType* arr;//动态数组int size;//有效数据个数int capacity;//空间大小
};

但是每次引用我们的顺序表时,我们都要写SeqList,这样未免太麻烦了,于是我们想到用typedef一下来缩减我们的工作量。

typedef struct SeqList SL;

或者我们还可以采用另一种方式:

typedef struct SeqList
{SLDataType* arr;//动态数组int size;//有效数据个数int capacity;//空间大小
}SL;

初始化

void SLInit(SL* ps);
void SLInit(SL s)
{s.arr=NULL;s.size=s.capcity=0;
}

我们测试一下顺序表初始化的一些方法:

void SLTest01()
{SL s1;SLInit(s1);
}int main()
{SLTest01();return 0;
}

这个程序初始化的结果竟然是错误的,那么问题出现在哪里呢?问题在于我们没有传地址,仅仅是传值调用了。那就让我们修改一下我们的代码吧。

void SLInit(SL* ps);
void SLInit(SL* ps)
{s.arr=NULL;s.size=s.capcity=0;
}
void SLTest01()
{SL s1;SLInit(&s1);
}int main()
{SLTest01();return 0;
}

销毁

void SLDestroy(SL* ps);
void SLDestroy(SL* ps)
{if(ps->arr){free(ps->arr);}ps->arr=NULL;ps->size=ps->capcity=0;
}

尾部插入

void SLPushBack(SL* ps, SLDataType x);//往哪儿插入未知,所以要传入结构体

如图所示,size从4变成了5。

void SLPushBack(SL* ps, SLDataType x)
{//我们要往size里面插入xps->arr[size++]=x;//size后置加加,完成这个式子以后,size的空间被扩展
}

插入完成之后,让我们测试一下这个函数吧。

void SLTest01()
{SL s1;SLPushBack(&s1,1);
}

 但是测试的结果竟然是错误的,这是为啥呢?

空间为0,不能往数组里插入数据。在插入数据之前,我们应该先检查空间够不够。

void SLPushBack(SL* ps, SLDataType x)
{//我们要往size里面插入xif(ps->capacity=ps->size){//申请空间,增容通常是成倍地增加//如果malloc失败,会返回空指针int newCapacity=ps->capacity==0?4:2*ps->capacity;//我们再把申请来的空间给临时的tmpSLDataType*tmp=(SLDataType*)realloc(ps->arr,newCapacity*sizeof(SLDataTpye);if(tmp==NULL){perror("realloc fail");exit(1);//直接退出程序,不再执行}ps->arr=tmp;//如果开辟成功,就把realloc出的新空间给arrps->capacity=newCapacity;ps->arr[size++]=x;//size后置加加,完成这个式子以后,size的空间被扩展
}

如果我们插入空(NULL),这个程序就崩了。说明这个代码还不具备健壮性

那么我们可以如何解决呢?

if(ps==NULL)
{return;
}

这样遇到空,程序就会结束。我们也可以换一种方式:

assert(ps);

等价于assert(ps!=NULL);   这时如果为空,就直接一个弹窗出来报错了。

头部插入

void SLPushFront(SL* ps, SLDataType x);

插入数据我们就想到空间是否够用呢?

void SLPushFront(SL* ps, SLDataType x)
{assert(ps);//检查ps是否为空SLCheckCapacity(ps);//先让顺序表向后挪动一位for(int i=ps->size;i>0;i--)//要判断函数的终止条件,就要看最后一个移动的条件是什么?这个程序是从后往前挪动,那么最后一次挪动就是arr[0]挪动到arr[1],那么i等于1,i大于0{ps->arr[i]=ps->arr[i-1];}ps->arr[0]=x;ps->size++;
}

在我们检查函数空间大小是否够用时,我们可以单独封装一个函数。

void SLCheckCapacity(SL*ps)
{//我们要往size里面插入xif(ps->capacity=ps->size){//申请空间,增容通常是成倍地增加//如果malloc失败,会返回空指针int newCapacity=ps->capacity==0?4:2*ps->capacity;//我们再把申请来的空间给临时的tmpSLDataType*tmp=(SLDataType*)realloc(ps->arr,newCapacity*sizeof(SLDataTpye));if(tmp==NULL){perror("realloc fail");exit(1);//直接退出程序,不再执行}ps->arr=tmp;//如果开辟成功,就把realloc出的新空间给arrps->capacity=newCapacity;
}

当我们运行完一个程序时,打印一下查看结果是否正确。

void Print(SL s)
{for(int i=0;i<s.size;i++){printf("%d",s.arr[i]);}printf("\n");
}

出乎意料的是,打印的结果不是我们想要的:

 好吧,增加一个数据,我们的size忘了++了。

尾部删除

void SLPopBack(SL*PS)
{
//ps不能为空,所以要先判断一下assert(ps);assert(ps->size);//数据个数也不能为空ps->arr[size-1]=-1;--ps->size;
}

直接把size--,不影响增删查改数据。

头部删除

void SLPopFront(SL*ps)
{assert(ps);assert(ps->size);for(int i=0;i<ps->size-1;i++){ps->arr[i]=ps->arr[i+1];//arr[size-1]=arr[size-2]}ps->size--;
}

在指定位置之前插入数据

void SLInsert(SL*ps,int pos,SLDataType x)
{assert(pos);assert(pos>=0&&pos<=ps->size);//可以等于,可以在size之前插入数据,在这里也就是尾插

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

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

相关文章

js的事件冒泡、捕获、委托

事件不仅存在js中&#xff0c;也存在在其他语言中&#xff0c;js事件背后的主要思想是能够在特定事件发生时运行代码。 先普及一个概念&#xff0c;什么是事件处理程序&#xff1f; 事件处理程序就像一个特殊的通用遥控器&#xff0c;可以执行某些操作&#xff0c;例如更改电…

java自动化-03-04java基础之数据类型举例

1、需要特殊注意的数据类型举例 1&#xff09;定义float类型&#xff0c;赋值时需要再小数后面带f float num11.2f; System.out.println(num1);2&#xff09;定义double类型&#xff0c;赋值时直接输入小数就可以 3&#xff09;另外需要注意&#xff0c;float类型的精度问题…

鸿蒙开发就业前景到底怎么样?

随着科技的不断进步&#xff0c;鸿蒙操作系统的推出为开发者们带来了新的机遇和挑战。鸿蒙&#xff0c;作为华为自主研发的操作系统&#xff0c;旨在为消费者提供更为流畅、安全的智能设备体验。那么&#xff0c;鸿蒙开发就业前景如何呢&#xff1f; 一、鸿蒙操作系统的优势 …

探索--------------redis缓存三大问题及解决方案

目录 一、redis的三大缓存问题 1、缓存穿透 1.1 问题描述 1.2缓存穿透发生的条件 1.3缓存穿透发生的原因 1.4解决方案 2、缓存雪崩 2.1问题描述 2.2解决缓存雪崩问题的方法有&#xff1a; 3、缓存击穿 &#xff08;热点数据集中失效&#xff09; 3.1问题描述 3.2缓…

SpringBoot快速入门笔记(3)

文章目录 一、MybatisPlus1、ORM2、添加依赖3、全局配置4、Navicat5、UserController6、CRUD操作7、BaseMapper8、两个注解 二、多表查询1、模拟用户订单2、通过用户查相关订单3、UserMapperNew4、查询订单和所属用户5、OrderMapper6、OrderController 三、条件查询四、分页查询…

【Ubuntu】用 VMware 安装 macOS

本教程使用 Ubuntu 20.04.6 LTS&#xff0c;VMware Workstation Pro 17.5.1&#xff0c;macOS Sonoma 14.4。文中所有需要的下载链接均以 Markdown 的形式体现在文字上。 下载 VMware Workstation Pro&#xff0c;目前最新版本是 17.5.1。 使用密钥&#xff0c;进行破解。 VM…

金融中的数学知识

随机偏微分方程相比普通偏微分方程具有额外的随机项&#xff0c;反映了其描述的现象具有随机性质

【核弹级安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…

中国大学生计算机设计大赛—软件应用与开发赛道—赛后感想

1.比赛介绍 中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一&#xff0c;是全国普通高校大学生竞赛排行榜榜单赛事之一。自2008年开赛至2019年&#xff0c;一直由教育部高校与计算机相关教指委等或独立或联合主办。大赛的目的是以赛促学、以赛促教、以赛促创&…

一些题目学习

1.打开文件添加helloworld public class Saier {public static void main(String[] args){String path"C:\\Users\\sjg\\Desktop\\abc.txt";String text"hello world";try {File file new File(path);FileWriter fileWriter new FileWriter(file,true);…

阴影画图转html

深受启发 https://segmentfault.com/a/1190000014943400?utm_sourcetag-newest https://gitee.com/yun-36/shadow-drawing 通过File对象&#xff0c;读成dataURL&#xff0c;生成图片&#xff0c;挂到canvas&#xff0c;生成图片文件对应的rgba数据像素点信息&#xff0c;处理…

ideaSSM 校园兼职招聘平台bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 校园兼职招聘平台是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

探索设计模式的魅力:揭秘B/S模式在AI大模型时代的蜕变与进化

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;探索设计模式的魅力&#xff1a;揭秘B/S…

小波降噪基础-python版本

这篇小文将使用小波多分辨分析对一个简单信号进行降噪&#xff0c;主要是降噪流程&#xff0c;为以后的小波更复杂的降噪算法打下良好的基础。降噪算法流程大致如下&#xff1a; &#xff08;1&#xff09;去趋势项&#xff08;如直流电流&#xff09;&#xff0c;并将数据归一…

不能在主机和虚拟机之间拷贝文本(虚拟机ubuntu16.04)

问题 ubuntu16.04不能在主机和虚拟机之间拷贝文本。 原因 vmware tools没安装好。 解决办法 重新安装vmware tools&#xff0c;步骤入下&#xff1a; 让虚拟机加载C:\Program Files (x86)\VMware\VMware Workstation\linux.iso光盘文件&#xff0c;设置如下&#xff1a; …

代码随想录算法训练营第30天|LeetCode236.二叉树的最小公共祖先

代码随想录算法训练营第30天|LeetCode236.二叉树的最小公共祖先 1、LeetCode236.二叉树的最小公共祖先 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 自底向上查找&#xff0c;有点难度&#xff01; | LeetCode&#xff1a;236. 二叉树的最近公共祖先_哔…

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…

Redis 缓存雪崩、穿透、击穿、预热

在实际工程中&#xff0c;Redis 缓存问题常伴随高并发场景出现。例如&#xff0c;电商大促、活动报名、突发新闻时&#xff0c;由于缓存失效导致大量请求访问数据库&#xff0c;导致雪崩、击穿、穿透等问题。因此&#xff0c;新系统上线前需预热缓存&#xff0c;以应对高并发&a…

文献阅读:将条形码神经解剖学与空间转录分析相结合,可以识别投射神经元相关基因

文献介绍 「文献题目」 Integrating barcoded neuroanatomy with spatial transcriptional profiling enables identification of gene correlates of projections 「研究团队」 Anthony M. Zador&#xff08;美国冷泉港实验室&#xff09; 「发表时间」 2021-05-10 「发表期…

# #一眼就解密

BUUCTF #一眼就解密 1 下面的字符串解密后便能获得flag&#xff1a;ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30 注意&#xff1a;得到的 flag 请包上 flag{} 提交 flag{THE_FLAG_OF_THIS_STRING}