数据结构之顺序表

news2024/12/25 9:35:36

目录

    • 一、什么是顺序表
    • 二、顺序表的分类
        • 1、静态顺序表
        • 2、动态顺序表(重要)
    • 三、C语言实现顺序表
        • 1、顺序表的基本结构
          • (2)、动态顺序表
        • 2、动态顺序表中常见的函数接口
          • (1)、初始化
          • (2)、销毁函数
          • (3)、尾插函数
          • (4)、尾删函数
          • (5)、头插函数
          • (6)、头删函数
          • (7)、扩容函数
          • (8)、打印顺序表
    • 四、顺序表的优缺点
        • 1、优点
        • 2、 缺点
    • 五、测试实验
    • 六、关于顺序表的代码实现中的一些细节

一、什么是顺序表

顺序表本质就是一个数组,这个数组可以定长可以不定长,它是指其中的数据是以顺序存储的方式进行存储的,不管在物理上还是逻辑上都是顺序的,在逻辑上是顺序的我们称之为线性表,物理上也是顺序存储的我们称之为顺序表,其存储数据必须由数组下标为0开始进行存储
顺序表的基本模型:
在这里插入图片描述

二、顺序表的分类

1、静态顺序表

从上面的图我们可以看出,静态顺序表就是表中的数组是定长数组的顺序表,其大小是不能发生改变的,这种一般不建议进行使用,因为其大小无法满足我们的需求

2、动态顺序表(重要)

动态顺序表是指其中的数据域数组的大小可以发生改变的顺序表,这个一般可以根据具体情况进行扩容

三、C语言实现顺序表

1、顺序表的基本结构

#####(1)、静态顺序表
在这里插入图片描述
其一般会配合宏来控制数组的大小,其大小是静态顺序表的一个缺点,大小确定小了,则顺序表不够用,如果确定大了,则可能导致内存的浪费

(2)、动态顺序表

在这里插入图片描述

2、动态顺序表中常见的函数接口

所有的函数需要在头文件中进行申明,在对应的源文件中进行定义实现

(1)、初始化

头文件声明:
在这里插入图片描述
源文件定义实现:
在这里插入图片描述

(2)、销毁函数

头文件申明:
在这里插入图片描述
源文件定义:
在这里插入图片描述
在顺序表中的销毁函数中,重点是要对资源惊进行释放,因为动态的顺序表的数组是通过malloc或者realloc来申请的,因此需要配套free函数进行资源的释放

(3)、尾插函数

头文件申明:
在这里插入图片描述
源文件定义:
在这里插入图片描述
基本逻辑:优先考虑是否需要进行扩容,之后再将数据插入到下标为size的位置

(4)、尾删函数

头文件声明:
在这里插入图片描述
源文件定义:
在这里插入图片描述
基本逻辑:只需要让顺序表标识的有效数据个数-1即可,在进行-1的时候需要检查有效数据个数是否>0,即检查顺序表中是否存在数据可以供删除

(5)、头插函数

头文件声明:
在这里插入图片描述
源文件定义:

在这里插入图片描述
基本逻辑:检查是否需要进行扩容,挪动数据(从后往前挪),将数据插入到顺序表中

(6)、头删函数

在这里插入图片描述
** 基本逻辑:先从第二个位置开始将数据一次往前挪,将要删除的第一个位置的数据进行覆盖,再将顺序表中的有效数据个数-1,进行删除一定要检查顺序表中是否存在数据,即psl->size>0 **

(7)、扩容函数

在这里插入图片描述
基本逻辑:先确定扩容后的新容量,我们这里是默认扩成原来的两倍,所以这里需要特别注意,一定要检查原来的容量是否为0,利用realloc函数进行扩容的时候有两种情况(原地扩容和异地扩容),将新申请的空间交给原来顺序表的数据域,更新顺序表中的容量
简单介绍一些realloc函数:
在这里插入图片描述
注意:realloc函数在进行扩容的时候会检查原来空间后面的空间内存是否满足新大小,如果满足,则进行原地扩容,如果不满足,则进行异地扩容。异地扩容会将原来空间的数据全部搬运到新空间上,因此此过程的效率会比较低

(8)、打印顺序表

在这里插入图片描述

四、顺序表的优缺点

1、优点

在进行数据的查找和尾插尾删的时候可以做到随机访问,时间复杂度为O(1)

2、 缺点

在进行头插和头删的时候需要挪动数据,因此此时效率比较低下,需要进行头插和头删的操作一般不建议使用顺序表

五、测试实验

  1. 测试尾插和尾删
    代码逻辑:
void Test_SeqList1()
{
	SeqList sl;
	// 这里我们需要注意:当创建一个结构体链表之后需要记得对结构体初始化
	SeqListInit(&sl);
	// 测试尾插的逻辑
	SeqListPushBack(&sl, 1);
	SeqListPushBack(&sl, 2);
	SeqListPushBack(&sl, 3);
	SeqListPushBack(&sl, 4);
	SeqListPushBack(&sl, 5);

	SeqListPrint(&sl);
	// 尾删
	SeqListPopBack(&sl);
	SeqListPrint(&sl);

	SeqListPopBack(&sl);
	SeqListPrint(&sl);

	SeqListPopBack(&sl);
	SeqListPrint(&sl);

	SeqListPopBack(&sl);
	SeqListPrint(&sl);

	SeqListPopBack(&sl);
	SeqListPrint(&sl);


}

结果:
在这里插入图片描述

  1. 测试Insert函数接口
    代码逻辑:
void Test_SeqList2()
{
	SeqList sl;
	SeqListInit(&sl);
	SeqListPushBack(&sl, 1);
	SeqListPushBack(&sl, 2);
	SeqListPushBack(&sl, 3);
	SeqListPushBack(&sl, 4);
	SeqListPrint(&sl);
	// 在pos位置插入数据
	SeqListInsert(&sl, 2, 5);
	SeqListPrint(&sl);

	SeqListInsert(&sl, 0, 6);
	SeqListPrint(&sl);

	SeqListInsert(&sl, 0, 7);
	SeqListPrint(&sl);

	// SeqListInsert(&sl, 100, 100);// 这个会报错,超出插入的范围
	SeqListPrint(&sl);
	

}

结果:
在这里插入图片描述

  1. 测试头插和头删
    代码逻辑:
void Test_SeqList3()
{
	SeqList sl;
	SeqListInit(&sl);
	// 头插
	SeqListPushFront(&sl, 1);
	SeqListPushFront(&sl, 2);
	SeqListPushFront(&sl, 3);
	// 3 2 1

	SeqListPrint(&sl);
	// 头删
	SeqListPopFront(&sl);
	SeqListPrint(&sl);
	SeqListPopFront(&sl);
	SeqListPrint(&sl); 
	SeqListPopFront(&sl);
	SeqListPrint(&sl);
}

结果:
在这里插入图片描述

六、关于顺序表的代码实现中的一些细节

  1. 函数接口中传顺序表总是传指针?
    如果只是传结构体对象的话,由于两个结构体的对象是处于两个不同的栈帧,因此修改其中一个结构体对象的指不会影响另一个结构体对象的值,传指针的话也能够在很大的程度上减少拷贝
  2. 在函数的实现中为什么需要对顺序表的指针进行断言检查?
    在顺序表中常见的函数接口中,经常需要访问到顺序表中的内容,如果此时用户不小心传了一个空指针进来,如果我们没有对该指针进行断言检查,那么在函数的实现中就会出现对空指针进行解引用(访问空指针指向的空间),此时就会造成程序崩溃
  3. 在插入函数中需要注意的点
    凡是进行插入,一定要提前检查是否需要进行扩容,尾插不需要挪动数据,在其他位置插入都需要挪动数据,在实现在pos位置插入数据的Insert函数接口一定要注意pos为0的情况,此时需要进行特殊处理
  4. 在删除函数中需要注意的点
    凡是进行删除,一定要检查顺序表中是否存在有效数据,即psl->size>0是否成立,如果忽略这一步,就会很容易造成后续的数组越界

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

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

相关文章

Java:什么是Quarkus?

Quarkus是一个全栈Kubernetes原生Java框架,用于Java虚拟机(JVM)和原生编译,专门针对容器优化Java,使其成为无服务器、云和Kubernete环境的有效平台。 Quarkus旨在与流行的Java标准、框架和库(如Eclipse MicroProfile和Spring)以及Apache Kafk…

基于FOC电路低次谐波抑制Simulink仿真

Foc电路如下图 当Sa导通时当Sb导通时当Sa导通时 Dc电压全被C2吃了 Lr电流向→ 当Sb导通时 Dc电压全被C1吃了 Lr电流向← 假设C1C2C&#xff0c;开关频率接近无穷、占空比为50%时 Uc1Uc2Udc/2、Ilr0 当占空比D>50%,Uc2增大&#xff0c;Ilr→增大 当占空比D<50%,Uc1增…

【java基础系列】13- java的面向对象

面向对象 程序是为了模拟现实世界&#xff0c;解决现实问题而使用计算机语言编写的指令集合。 1、面向对象的思想&#xff08;Object Oriented Programming&#xff09; 一切客观存在的事物都是对象&#xff0c;万物皆对象。任何对象&#xff0c;一定具有自己的特征和行为 特…

【计算机网络】HTTPS协议的加密流程

文章目录HTTPS简介关于加密过程中的名词SSL中的加密操作对称加密非对称加密证书HTTPS执行流程总结HTTPS简介 HTTPS协议也是应用层的协议&#xff0c;它是在HTTP协议的基础上引入了加密层&#xff0c;称为SSL&#xff08;旧的叫法&#xff09;或TLS&#xff08;新的叫法&#x…

如何用卡片翻转动画制作一个星座运势页面

效果展示&#xff1a;前置准备&#xff1a; 图片素材 有文案素材的detail页面 配置按钮组件触发器 具体步骤&#xff1a; 添加配置按钮、图片组件 配置图片组件动画和触发器步骤分解&#xff1a; 添加配置轮播图基础组件 添加 按钮 组件 添加 图片 组件 选中 按钮 组件 在 数据…

【菜鸡读论文】Learning-based Video Motion Magnification

Learning-based Video Motion Magnification 哈喽&#xff0c;大家好呀&#xff01; 这周有点开心&#xff0c;看到了一篇很有趣的论文。最近天气好热&#xff0c;明明已经十一月了&#xff0c;最近的温度却一直在25度以上&#xff0c;甚至有种可以过夏天&#xff0c;穿裙子的…

怎么给图片添加贴纸?介绍几个简单的方法

不知道大家会不会跟我有同样的想法&#xff0c;不论是经过精心调整拍摄出来的照片&#xff0c;还是平时随手一拍的照片&#xff0c;要发到社交软件上时&#xff0c;都想要添加一些有趣的贴纸或者文字进去。如果照片的内容过于空乏&#xff0c;添加贴纸文字进去会增加照片的趣味…

数学基础之博弈论

1.移棋子游戏 mex为最小的不存在的自然数 #include<bits/stdc.h> using namespace std; const int N2e310,M2e410; int h[N],e[M],ne[M],idx; int n,m,k; int f[N]; void add(int a,int b) {e[idx]b,ne[idx]h[a],h[a]idx; } int sg(int u)//求sg函数 {if(f[u]!-1) return…

Ubuntu16.04搭建UbertoothOne环境

Ubuntu16.04搭建UbertoothOne环境 【支持原创&#xff0c;转载需经过作者同意&#xff0c;否则追究相关责任】 相关链接 ubertoothone 主页ubertoothone github 环境说明 操作系统&#xff1a;Ubuntu 16.04.3 LTSUbertooth软件版本&#xff1a;ubertooth 2020-12-R1Libbtb…

想要精通算法和SQL的成长之路 - 跳跃游戏系列

想要精通算法和SQL的成长之路 - 跳跃游戏系列前言一. 跳跃游戏二. 跳跃游戏II前言 想要精通算法和SQL的成长之路 - 系列导航 一. 跳跃游戏 原题链接 给定一个非负整数数组 nums &#xff0c;你最初位于数组的第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。…

TCP、UDP API调用(实时聊天)

1. TCP连接 服务器创建ServerSocket&#xff0c;并指定端口进行监听&#xff1b; ServerSocket通过accept()接受用户请求并返回Socket&#xff0c;否则一直处于监听状态&#xff0c;线程阻塞&#xff1b; 客户端创建Socket&#xff0c;需要指定服务器的ip和端口&#xff0c;向服…

OpenGL之纹理映射

1.1 Texture Mapping 1.1.1 在OpenGL编程中&#xff0c;应用纹理主要分为四步&#xff1a; 创建纹理对象&#xff0c;并为它装载一个纹理&#xff1b; glGenTexture(1,&texName); //为每个纹理编号&#xff0c;1代表生成一个编号 glBindTexture(GL_TEXTURE_2D,texNam…

一道题学习node.js中的CRLF注入

前言 这几天刷题遇到在node.js题目中注入CRLF实现ssrf的题目&#xff0c;对于我来说知识听新颖。在此记录一下。 CRLF注入 学习过http请求走私漏洞的师傅对于这个CRLF肯定不会陌生。所谓的CRLF就是回车加换行。常用于http数据包。字段之间用一个CRLF分割&#xff0c;首部和主…

【MySQL篇】约束语法及演示总结(全)

目录 理解约束&#xff1a; 约束语法及添加、删除约束语法&#xff1a; 约束总览&#xff1a; ​1、非空约束 2、唯一约束 3、主键约束 4、默认约束 5、外键约束 案例演示&#xff1a; 加深格式记忆&#xff1a; 理解约束&#xff1a; 约束实际上就是我们对表中数据的…

Redis命令及原理学习(一)

redis介绍 redis 是 Remote Dictionary Service 的简称&#xff1b;也是远程字典服务&#xff1b; 节点 通过tcp与redis建立连接交互请求回应模型 redis是一种内存数据库&#xff1a;数据都在内存中。redis是一种kv数据库&#xff1a; 存储方式操作方式 redis是一种数据结构数…

【访谈】Eotalk Vol.05: API 全生命周期管理,如何解决企业 API 安全问题

Eotalk 是由 Eolink 和各合作方一起发起的泛技术聊天活动&#xff0c;每期我们会邀请一些技术圈内的大牛聊聊天&#xff0c;聊一下关于技术、创业工作、投融资等热点话题。 本期 Eotalk 我们邀请到的嘉宾是来自星阑科技的 CTO 徐越~ &#x1f44f;&#x1f44f; 徐越是一位 90…

红黑树(4万字文章超详细,只为一个目的)

我写这篇文章的主要目的其次才是积累知识,主要是因为我想打一个同学的脸. 事情是这样的.我现在中学嘛,我们班上有一个同学他学了红黑树啊,就一副"不可一世"的样子.在我面前炫耀啊.当时我就想立马打他的脸,可是我有没有实力,所以才学习红黑树学到深夜,写了篇博客.言归…

深度解析:会用Excel,还有必要学Python吗?

前言 某站上有个问题&#xff1a; 我都会用Excel了&#xff0c;还有必要学Python吗&#xff1f; &#xff08;文末送读者福利&#xff09; 这个问题大概率可以说明问这个问题的这位同学目前还没有遇到非Python不可的场景&#xff0c;之所以产生了学Python的念头是因为这两年P…

今日分享:文字转语音软件哪个好

如今已经进入到了一个短视频时代&#xff0c;大家饭后或者闲暇时都会通过刷视频来消磨时间&#xff0c;而部分小伙伴看到一些有趣的内容&#xff0c;也想试着自己制作一下。但众所周知&#xff0c;视频拍摄容易&#xff0c;后期剪辑制作确实异常困难的&#xff0c;有许多道工序…

从boot引导到loader引导完整运行

此文针对该文章对loader引导进行了完善后的完整运行过程。&#xff08;具体细节请参见下文&#xff09; boot引导升级&#xff0c;成功引导运行loader_What’smean的博客-CSDN博客boot引导升级&#xff0c;成功引导运行loaderhttps://blog.csdn.net/weixin_42492218/article/d…