数据结构之手撕顺序表(讲解➕源代码)

news2024/11/24 17:03:31

0.引言

在本章之后,就要求大家对于指针、结构体、动态开辟等相关的知识要熟练的掌握,如果有小伙伴对上面相关的知识还不是很清晰,要先弄明白再过来接着学习哦!

那进入正题,在讲解顺序表之前,我们先来介绍线性表这个数据结构。

0.1 线性表

线性表是 n个具有相同特性的数据元素组成的有限的序列。

相同特性:同一种数据类型
有限:数据元素的个数是有限的

常见的线性表:顺序表、链表、栈、队列、字符串等。

0.2 线性表的逻辑结构和物理结构

0.2.1 逻辑结构

线性表的逻辑结构是线性结构,线性结构 是一条连续的直线,也就是说 线性表在逻辑上是连续的,比如我们在C语言学过的的数组(顺序表),指针(可以构成链表)。

上图分别为顺序表跟链表,他们在逻辑结构上都是一个接着一个,连续的。然而在物理结构他们还依旧连续吗?

0.2.2 线性表的物理结构

线性表在物理结构上不一定连续,我们可以构成线性表的结构有数组和指针,指针又被称作链式结构。

当线性表是由数组构成时
        它在逻辑结构是连续的,物理结构也一定连续,因为数组是一个一个挨着的空间,在地址上是紧挨着的,所以是连续的。

如图:

当线性表为链式结构时

        链式结构在逻辑上一定是连续的,因为我们可以通过指针就找到该指针对应的地址
        但指针的地址不一定是连续的,我们可以这存一个,那存一个,通过指针给他们链接起来。

如图:

当了解了线性表之后,就让我们一起学习第一种数据结构——顺序表吧!

1. 顺序表

1.1概念

顺序表是 用一段物理地址连续的存储单元依次存储数据元素的线性结构,通常采用数组的形式存储。在数组上完成数据的增删查改。

1.2 顺序表的分类

1.2.1 静态顺序表

静态顺序表指的是利用定长数组来存储元素

//顺序表的静态存储
#define N 7 //顺序表一次开辟的空间个数
typedef int SLDataType; //将数据类型重命名,以便我们未来换用其他的数据类型
typedef struct SeqList
{
    SLDataType arr[N]; //定长数组
    size_t size; //有效的数据个数,size_t指的是无符号整型
}Seqlist;

我们在使用静态顺序表的时候,只能每次开辟N个大小的空间,这也就要求我们在使用之前就要想好你要存放多少个数据,非常不灵活,所以我们大多时候不使用静态顺序表,而是改用动态顺序表作为我们日常应用。

1.2.2 动态顺序表

动态顺序表:使用动态开辟的数组存储。

1. 动态顺序表的定义
typedef int SLDataType; //数据类型的重命名,方便更改数据类型
typedef struct SeqList
{
    SLDataType *a; //指向动态开辟的数组
    int size;     //有效的数据个数
    int capacity; //动态开辟的数组的容量
}SL;
2.初始化
void SLInit(SL*ps) //初始化
{
    ps->a = (SLDataType*)malloc(sizeof(SLDataType)*4);
    if(ps->a == NULL)
    {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    ps ->size = 0;
    ps ->capacity = 4;
}
3.退出程序时的销毁
void SLDestroy(SL*ps) //退出时销毁
{
    free(ps->a);
    ps->a = NULL;
    ps->size = 0;
    ps->capacity = 0;
}
4.尾插尾删
尾插
void SLPushBack(SL*ps,int i) 
{
    SLCheckCapacity(ps);
    ps->a[ps->size] = i;
    ps->size++;
}

尾删
void SLPopBack(SL*ps) 
{
    assert(ps->size > 0);
    ps->size--;
}
5.头插头删
头插
void SLPushFront(SL*ps,int i)
{
    SLCheckCapacity(ps);
    int end = ps->size;
    for(;end - 1 >= 0 ; end--)
    {
        ps->a[end] = ps->a[end - 1];
    }
    ps->a[0] = i;
    ps->size++;
}
 ///头删
void SLPopFront(SL*ps)
{
    assert(ps->size > 0);
    int i = 0;
    for(i = 0 ; i + 1 < ps->size ; i++)
    {
        ps->a[i] = ps->a[i+1];
    }
    ps->size--;
}
6.扩容
void SLCheckCapacity(SL*ps)  //扩容函数
{
    if(ps->size == ps->capacity)
    {
        SLDataType *tmp = (SLDataType*)realloc(ps->a,((sizeof(SLDataType)) * ((ps->capacity) * 2)));
        if(tmp == NULL)
        {
            perror("realloc");
            exit(EXIT_FAILURE);
        }
        ps -> a = tmp;
        ps->capacity *= 2;
    }
}
7.打印
void SLPrint(SL*ps) //打印
{
    int i = 0;
    for(i = 0 ; i < ps->size ;i++)
    {
        printf("%d ",ps->a[i]);
    }
    printf("\n");
}

以上就是顺序表的相关接口实现。

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

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

相关文章

2.DApp-编写和运行solidity智能合约

题记 演示如何编写solidity智能合约&#xff0c;以及在remix中运行solidity代码。 准备Remix环境 在浏览器中搜索remix&#xff0c;找到remix官网&#xff0c;并打开 由于是国内网络&#xff0c;所以访问国外网站较慢&#xff0c;可以耐心等待加载完成&#xff0c;或者科学上网…

2023_Spark_实验十五:自定义法创建Dataframe及SQL操作

方式二&#xff1a;SQL方式操作 1.实例化SparkContext和SparkSession对象 2.创建case class Emp样例类&#xff0c;用于定义数据的结构信息 3.通过SparkContext对象读取文件&#xff0c;生成RDD[String] 4.将RDD[String]转换成RDD[Emp] 5.引入spark隐式转换函数&#xff08…

Linux入门攻坚——3、基础命令学习-文件管理、别名、glob、重定向、管道、用户及组管理、权限管理

文件管理&#xff1a;cp&#xff0c;mv&#xff0c;rm cp&#xff1a;复制命令&#xff0c;copy cp [OPTION]... [-T] SRC DEST cp [OPTION]... SRC... DIRECTORY cp [OPTION]... -t DIRECTORY DEST... 如果目标不存在&#xff0c;新建DEST&#xff0c;并将…

Motorola IPMC761 使用边缘TPU加速神经网络

Motorola IPMC761 使用边缘TPU加速神经网络 人工智能(AI)和机器学习(ML)正在塑造和推进复杂的自动化技术解决方案。将这些功能集成到硬件中&#xff0c;解决方案可以识别图像中的对象&#xff0c;分析和检测模式中的异常或找到关键短语。这些功能对于包括但不限于自动驾驶汽车…

易点易动设备管理平台:高效设备一站式管理助力企业成功

在现代企业运营中&#xff0c;设备管理是一个至关重要的任务。无论是生产设备、办公设备还是信息技术设备&#xff0c;高效的设备管理对于企业的生产效率和运营成本都具有重要影响。然而&#xff0c;传统的设备管理方式往往繁琐且容易出错&#xff0c;给企业带来了许多挑战。为…

为什么STM32的HAL库那么难用?

为什么STM32的HAL库那么难用&#xff1f; 在使用q banks和hell库时&#xff0c;开发速度简直快到让人觉得不可思议。最近我要开发一款三十八千赫兹红外应用。之前从未接触过这。最近很多小伙伴找我&#xff0c;说想要一些HAL库资料&#xff0c;然后我根据自己从业十年经验&…

如何使用本地PHP搭建本地Imagewheel云图床在公网远程访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

FPGA笔试

1、FPGA结构一般分为三部分&#xff1a;可编程逻辑块&#xff08;CLB&#xff09;、可编程I/O模块和可编程内部连线。 2 CPLD的内部连线为连续式布线互连结构&#xff0c;任意一对输入、输出端之间的延时是固定 &#xff1b;FPGA的内部连线为分段式布线互连结构&#xff0c;各…

RXIDK 2H 1MRK000838-HA 双通道模拟输入/输出本质安全栅

RXIDK 2H 1MRK000838-HA 双通道模拟输入/输出本质安全栅 这是首款采用紧凑型12.5 mm外壳的双通道、双功能AI/AO本质安全屏障。KCD2-SCS系列接口模块的两个通道可针对模拟输入或模拟输出控制信号进行单独配置。它们也是HART兼容的&#xff0c;可用作智能阀门定位器的输出驱动器…

文件改名:一键将文件名称改成跟目录名称一样

在日常工作中&#xff0c;我们经常会遇到需要将文件名称改成与目录名称相同的情况。这样可以让文件和目录的关联更加紧密&#xff0c;方便我们查找和管理。那么&#xff0c;如何实现一键将文件名称改成跟目录名称一样呢&#xff1f;下面就给大家介绍一个高效的文件管理小技巧。…

电动移动设备上亚马逊美国站的合规认证是什么?如何办理?

电动移动设备上亚马逊美国站的合规标准是什么&#xff1f; 亚马逊电动移动设备政策 根据我们的政策&#xff0c;您不能销售的商品 我们需要让买家确信其在亚马逊商城找到的商品均安全、可靠、合规。我们不允许发布和销售不合规商品或禁售商品。出于安全考虑&#xff0c;禁止销…

【LeetCode热题100】--55.跳跃游戏

55.跳跃游戏 方法&#xff1a;贪心 对于数组的任意一个位置y&#xff0c;如何判断它是否可以到达&#xff1f; 只要存在一个位置x,它本身可以到达&#xff0c;并且它跳跃的最大长度为xnums[x]&#xff0c;这个值大于等于y&#xff0c;即xnums[x]≥y&#xff0c;那么这个位置y…

L003748-AR 3BSX108237R300 需插入以太网电缆并给设备通电

L003748-AR 3BSX108237R300 需插入以太网电缆并给设备通电 Auto-IP是自动为替换设备分配固定IP地址的最简单、最具成本效益的方法&#xff01;避免DHCP选项82的复杂性和硬件特定要求。Auto-IP将为您配置一个简单的“即插即用”机制。只需插入以太网电缆并给设备通电。每当您需…

网络安全神器,资深网工必备(全都免费附安装包)

导读&#xff1a; 在一个完美的世界里&#xff0c;信息安全从业人员有无限的安全预算去做排除故障和修复安全漏洞的工作。但是&#xff0c;正如你将要学到的那样&#xff0c;你不需要无限的预算取得到高质量的产品。这里有SearchSecurity.com网站专家Michael Cobb推荐的五个免费…

Unity——数据存储的几种方式

一、PlayerPrefs PlayerPrefs适合用于存储简单的键值对数据 存储的数据会在游戏关闭后依然保持&#xff0c;并且可以在不同场景之间共享&#xff0c;适合用于需要在游戏不同场景之间传递和保持的数据。 它利用key-value的方式将数据保存到本地&#xff0c;跟字典类似。然后通…

【算法|前缀和系列No.3】leetcode LCR 012. 寻找数组的中心下标

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【leetcode)】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

ThinkPHP5小语种学习平台

有需要请加文章底部Q哦 可远程调试 ThinkPHP5小语种学习平台 一 介绍 此小语种学习平台基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。平台角色分为学生&#xff0c;教师和管理员三种。学生注册登录后可观看学习视频&#xff0c;收藏视频&#xf…

mysql查看连接池的命令

查看实时连接的个数 &#xff08;瞬时值&#xff09; SHOW STATUS LIKE Threads_connected; 查看具体的链接信息 show full processlist;

直播回顾 | 京东科技研发效能度量的大体系与小实践

9 月 27 日思码逸 DevData Talks 邀请到了京东科技测试架构师刘刚。他以《研发效能度量之大体系小实践》为主题&#xff0c;分享了如何以集团的研发效能度量体系作为指引&#xff0c;在所属部门落地适应自己团队和业务特点的度量体系&#xff0c;并取得有效的改进成果。其中他还…

九.镜头知识之CRA(ChiefRay Angle) 主光线角度

九.镜头知识之CRA(ChiefRay Angle) 主光线角度 文章目录 九.镜头知识之**CRA(ChiefRay Angle) 主光线角度**1.9.1 Sensor接收光能1.9.1.1 CRA 定义1.9.1.2 Lens CRA1.9.1.3 Sensor CRA1.9.2 Lens和Sensor搭配的三个重要参数1.9.2.1 ov7251 cra定义:主光线角度为主光线与平行光…