顺序表基础

⽬录
1. 课前准备
2. 顺序表概念及结构
3. 顺序表分类
4. 实现动态顺序表

正⽂开始
课前预备

1. 课程⽬标

C语⾔语法基础到数据结构与算法,前⾯已经掌握并具备了扎实的C语⾔基础,为什么要学习数据结构
课程?⸺通讯录项⽬

2. 需要的储备知识

简单了解,通讯录具备增加、删除、修改、查找联系⼈等操作。要想实现通讯录项⽬有两个技术关
键:
1)C语⾔语法基础
2)数据结构 之 顺序表/链表

3. 数据结构相关概念

 1、什么是数据结构

数据结构是由“数据”和“结构”两词组合⽽来。
什么是数据?常⻅的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、学历等
等)、⽹⻚⾥⾁眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据
什么是结构?
当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性
⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的
⽅式。
想要找到草原上名叫“咩咩”的⽺很难,但是从⽺圈⾥找到1号⽺就很简单,⽺圈这样的结构有效将
⽺群组织起来
概念:数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系
的数据元素的集合。数据结构反 映数据的内部构成,即数据由那部分构成,以什么⽅式构成,以及数

据元素之间呈现的结构。
总结:
1)能够存储数据(如顺序表、链表等结构)
2)存储的数据能够⽅便查找
2、为什么需要数据结构?

如图中所⽰,不借助排队的⽅式来管理客⼾,会导致客⼾就餐感受差、等餐时间⻓、餐厅营业混乱等
情况。同理,程序中如果不对数据进⾏管理,可能会导致数据丢失、操作数据困难、野指针等情况。
通过数据结构,能够有效将数据组织和管理在⼀起。按照我们的⽅式任意对数据进⾏增删改查等操
作。
最基础的数据结构:数组。
【思考】有了数组,为什么还要学习其他的数据结构?
假定数组有10个空间,已经使⽤了5个,向数组中插⼊数据步骤:
求数组的⻓度,求数组的有效数据个数,向下标为数据有效个数的位置插⼊数据(注意:这⾥是
否要判断数组是否满了,满了还能继续插⼊吗).....
假设数据量⾮常庞⼤,频繁的获取数组有效数据个数会影响程序执⾏效率。
结论:最基础的数据结构能够提供的操作已经不能完全满⾜复杂算法实现。

顺序表

1、顺序表的概念及结构

1.1 线性表

线性表( linear list )是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使
⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,
线性表在物理上存储时,通常以数组和链式结构的形式存储。
案例:蔬菜分为绿叶类、⽠类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合
如何理解逻辑结构和物理结构?

2、顺序表分类 

顺序表和数组的区别
顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝
顺序表分类
静态顺序表
概念:使⽤定⻓数组存储元素

静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费 

动态顺序表  

 3、静态顺序表

最简答的可以这样写

 下面是优化后的代码:

最好是一开始就养成好的习惯

4.动态顺序表 

4.动态顺序表和静态顺序表的优势和劣势

5 .动态顺序表的简单实现

5.1初始化顺序表

这里需要创建3个文件

 

注意这里要放我们写的结构的指针类型要不然没办法传值,但这里太长太繁琐了这里重命名一下

下面是优化后的代码:

 写一个简单的来测试这个是否初始化成功

通过调试观察初始化是否成功

 可以看到三个成员都已经初始化成功

5.2 顺序表的插入

顺序表的插入大致可以分成三种

头插入,尾插,任意

5.3 扩容规则

第一种和第二种都存在一定的问题这里推进是第三种 

 

观察上面通过观察可以得出不管是头插还是尾插只要是capacity(容量)和size(有效数据)相等的时候那么这个时候再插入这里就要扩容了,

5.4扩容代码

5.5尾插

void SLPushBack(MySL* sl, SLdatatype x)//SLdatetype现在就是int
{SLcheckcapacity(sl);//SLcheckcapacity(&(sl->arr));sl->arr[sl->size] = x;sl->size++;
}

 这里通过调试可以看到已经插入成功

 5.6打印顺序表的元素

为了方便这里给他封装成一个函数打印

 在尾插这里插入一个空指针,这里直接给干出bug了,所以这里要在尾插这里判断一下

这样就可以避免空指针直接错误

还可以直接断言

加上需要的头文件

 

 这里断言就会直接告诉我们错哪里的这种方式比较粗暴

 5.7头插

如果这里直接把100插入到0那里,那么0的那个数据就会直接丢失,所以应该先移动数据,把所以的数据往后移动一位, 所以我们循环要从后往前写

5.8尾删

 

 

 5.9头删        

 

5.10指定位置 插入

假如在第3(按照从0开始)个插入四变成123456

 

 

 5.11指定位置删除

这里删除多余的2

 

 

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

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

相关文章

小程序分账方案:实现商户分账的简便与灵活

随着移动支付的普及和小程序的快速发展,越来越多的商家选择在微信小程序上开展业务。然而,对于一些有多个分账方的商户而言,如何实现快速、准确和灵活的资金分账成为了一个挑战。本文将介绍一种高效的小程序分账方案,帮助商户轻松…

C++ STL 优先队列(priority_queue)

1.优先队列是一种极其特殊的队列,他与标准的队列使用线性结构进行计算不同,优先队列的底层是以散列的状态(非线性)表现的,他与标准的队列有如下的区别,标准的队列遵从严格的先进先出,优先队列并…

负载均衡Ribbon和LoadBalancer

Ribbon和LoadBalancer都是用于实现负载均衡的工具,但它们在应用场景和实现方式上有所不同。 Ribbon 是一个客户端负载均衡器,它是一个Java库,可以在客户端应用程序中使用。通过在客户端应用程序中维护服务实例列表,并使用负载均衡…

修改docker默认存储位置【高版本的docker】

一、修改docker默认存储位置 1、停服务 systemctl stop docker 2、修改/etc/docker/daemon.json添加新的dcoker路径 如"data-root": "/mnt/hdd1/docker" 3、保存后重启服务:systemctl restart docker 二、其他服务的命令 systemctl disab…

AcWing 787. 归并排序 解题思路及代码

先贴个题目&#xff1a; 以及原题链接&#xff1a;787. 归并排序 - AcWing题库https://www.acwing.com/problem/content/789/纯板子题&#xff0c;先贴代码吧&#xff0c;根据代码讲思路&#xff1a; #include <iostream> using namespace std;const int N 1e5 10; in…

【Maven】Maven 基础教程(三):build、profile

《Maven 基础教程》系列&#xff0c;包含以下 3 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

修饰符【C#】

分为四部分&#xff1a;属性修饰符&#xff0c;存取修饰符&#xff0c;类修饰符和成员修饰符。 属性修饰符&#xff1a; [Serializable]&#xff1a;按值将对象封送到远程服务器。在按值封送对象时&#xff0c;就会创建一个该对象的副本&#xff0c;并将其序列化传送到服务器…

TCP/UDP,HTTP、HTTPS存在什么风险会影响到网络安全吗

近年来&#xff0c;随着网络技术的飞速发展&#xff0c;互联网影响人们的方方面面&#xff0c;我们平时也接触到许多以前从未听过的东西&#xff0c;今天德迅云安全就来分享下一些互联网安全知识&#xff0c;讲解一些关于常看到的关于IP, TCP/UDP&#xff0c;HTTP、HTTPS这些名…

QT之液晶电子时钟

根据qt的<QLDNumber>做了一个qt液晶电子时钟. 结果 实时显示当前时间,左键可以拖动时钟在屏幕的位置,右键点击关闭显示. 实现过程 新建一个class文件,让这个文件的父类是QLCDNumber 相关功能变量定义和函数实现 .c文件代码 这里需要注意的一点是event->button是获取的…

SpringMVC自定义视图解析器

/** * 使用View接口完成请求转发|重定向 * 解释: * SpringMVC的官方&#xff0c;提供了一个叫做View的接口&#xff0c;告诉开发人员 * DispatcherServlet底层会调用View接口的实例化对象中的逻辑方法 * 来完成对应的请求转发和重定向。 * 使用: * 1. 单元方法的返回值为View接…

前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较&#xff0c;把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较&#xff0c;减轻人为的重复验证测试。多用户并发操作需要自动…

【开源】JAVA+Vue.js实现APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

pdfpages 宏包和 includepdf 使用问题

在 latex 中插入其他 pdf 文档的页时 \usepackage{pdfpages} % 插入 PDF 页 \includepdf[pages-]{pg276-axi-hbm-en.pdf} 用 xelatex 编译生成的 pdf 文档内容会与原文档内容不一致&#xff0c;文字位置对折等问题。 解决办法&#xff1a; A 文档中的某些…

springBoot整合Redis(二、RedisTemplate操作Redis)

Spring-data-redis是spring大家族的一部分&#xff0c;提供了在srping应用中通过简单的配置访问redis服务&#xff0c;对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装&#xff0c;RedisTemplate提供了redis各种操作、异常处理及序列化&#xff0c;支持发布订阅&…

Android:BitmapFactory.decodeStream Bitmap的内存优化OutOfMemory异常以后Crash闪退

自己项目中使用如下方法&#xff0c;有的手机上会奔溃报错&#xff0c;原因是BitmapFactory.decodeStream部分没有使用options参数改变内存大小 改成如下形式后正常了&#xff1b;正确解决方案&#xff1a;设置inSampleSize 一&#xff09;Android BitmapFactory.decodeStream(…

C++利用汇编挖掘编程语言的本质..

1.谬论 很多非一手的资料特别是中文资料其实并不可靠 因为很多作者都是直接通过转载他人的作品 也不管他人作品真与假 而且有一部分的作品中的言论和官方描述相去甚远 有的则是翻译的过程中出现了问题 比如sizeof很多人认为是一个函数 其实他并不是一个函数 而是一个运算符 是…

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit

1.问题描述 升级到4.0.0.59版本后&#xff0c;通过pushService.getToken获取华为的token时报如下错误&#xff1a;Illegal application identity. 解决方案 Mate 40 Pro (NOH) 从 4.0升级到4.1版本后&#xff0c;会出现UDID变化&#xff0c;影响历史的调试签名使用&#xff…

档案数字化验收流程

档案数字化验收流程通常包括以下步骤&#xff1a; 1. 确定验收标准&#xff1a;制定档案数字化验收标准&#xff0c;明确要求检查的内容、质量要求、验收标准等。 2. 准备验收环境&#xff1a;为档案数字化验收准备合适的环境&#xff0c;包括验收场所、设备、人员等。 3. 准备…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

Semantic human matting

1.introduction 数据集包括&#xff0c;时尚模特数据集&#xff0c;超过18.8w张模特图&#xff0c;从中选出35311张图片&#xff0c;DIM数据集&#xff0c;仅包含人类的图像&#xff0c;202个前景图像&#xff0c;背景来自coco数据集和互联网&#xff0c;背景图不含人类&#x…