【数据结构入门】顺序表详解(增删查改)

目录

顺序表的基本概念

动态顺序表的实现

初始化

插入

尾插法

头插法

指定位置之前插入

删除

尾删法

头删法

指定位置删除

查找

销毁


顺序表的基本概念

什么是顺序表?

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

简单来讲,顺序表的底层结构就是数组,只不过在数组的基础上,实现的增删改查等接口。

顺序表的分类:

  • 静态顺序表
  • 动态顺序表

静态顺序表:使用定长数组存储元素;

typedef struct Seqlist {
    SLdatatye arr[N];//定长数组
    int size;//有效数据个数
}SL;

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

因此我们在日常主要使用动态顺序表;


动态顺序表:按需申请空间;

typedef struct Seqlist {
    SLdatatye* arr;//存储数据的底层结构
    int capacity;//记录顺序表空间大小
    int size;//记录顺序表当前有效的数据个数
}SL;

动态顺序表的实现

首先创建一个工程:

  • SeqList.h:定义顺序表的结构,顺序表要实现的接口/方法;
  • SeqList.c:具体实现顺序表定义的接口/方法;
  • test.c:测试顺序表;

初始化

SeqList.h:

void SLinit(SL* s);

SeqList.c:

void SLinit(SL* s)
{
    s->arr = NULL;
    s->size = s->capacity = 0;
}

插入

数据的插入有多种方法:

  • 头插法;
  • 尾插法;
  • 指定位置插入;

尾插法

对于空间足够的情况我们选择直接插入即可;

如果空间不够,我们就需要扩容;

SeqList.h:

 void SLinsertback(SL* s, SLdatatye x);

void SLcheakcapacity(SL* s);//扩容

SeqList.c:

void SLinsertback(SL* s, SLdatatye x)
{
    assert(s != NULL);
    //空间不够,扩容
    SLcheakcapacity(s);

    //空间足够
    s->arr[s->size++] = x;
}

void SLcheakcapacity(SL* s)
{
    if (s->size == s->capacity)
    {
        //三目表达式:
        int newcapacity = s->capacity == 0 ? 4 : 2 * s->capacity;
        SLdatatye* tmp = (SLdatatye*)realloc(s->arr, 2 * newcapacity * sizeof(SLdatatye));
        if (tmp == NULL)
        {
            perror("realloc fail!");
            exit(1);
        }
        //扩容成功
        s->arr = tmp;
        s->capacity = newcapacity;
    }

}

从图中我们可以看到当capacity ==size时说明空间已满,此时如若再添加数据就需要进行扩容,增大空间,这里使用的是realloc;因为在头插法,指定位置插入都需要扩容,为了方便,我们将扩容单独写成一个函数;

头插法

  •  先将数据全部往后平移;
  •  再在首位插入; 

SeqList.h:

void SLinsertfront(SL* s, SLdatatye x);

SeqList.c:

void SLinsertfront(SL* s, SLdatatye x)
{
    assert(s != NULL);
    SLcheakcapacity(s);
    for (int i = s->size; i >= 0; i--)//平移
    {
        s->arr[i] = s->arr[i-1];
    }
    s->arr[0] = x;//插入
    s->size++;
}

指定位置之前插入

先平移,后插入,注意size要变化

SeqList.h:

void SLinsert(SL* s, int pos, SLdatatye x);

SeqList.c:

void SLinsert(SL* s, int pos, SLdatatye x)
{
    assert(s);
    SLcheakcapacity(s);
    for (int i = s->size; i >pos; i--)//平移
    {
        s->arr[i] = s->arr[i - 1];
    }
    s->arr[pos] = x;//插入
    s->size++;
}

删除

  • 头删法;
  • 尾删法;
  • 指定位置删除;

尾删法

SeqList.h:

void SLdeleteback(SL* s);

SeqList.c:
void SLdeleteback(SL* s)
{
    s->size--;
}

头删法

SeqList.h:

void SLdeletefront(SL* s);

SeqList.c:

void SLdeletefront(SL* s)
{
    for (int i = 0; i < s->size-1; i++)
    {
        s->arr[i] = s->arr[i + 1];
    }
    s->size--;
}

指定位置删除

SeqList.h:

void SLdelete(SL* s, int pos);

SeqList.c:

void SLdelete(SL* s, int pos)
{
    assert(pos < s->size);
    assert(s);
    for (int i = pos; i < s->size; i++)
    {
        s->arr[i] = s->arr[i + 1];
    }
    s->size--;
}

查找

插入本质就是变量;找到就返回其下标,未找到就返回-1

SeqList.h:

int SLfind(SL* s, SLdatatye x);

SeqList.c:

int SLfind(SL* s, SLdatatye x)
{
    assert(s);
    for (int i = 0; i < s->size; i++)
    {
        if (s->arr[i] == x)
            return i;
    }
    return -1;
}

销毁

SeqList.h:

void SLdestroy(SL* s);

SeqList.h:

void SLdestroy(SL* s)
{
    if(s->arr!=NULL)
    {
        free(s->arr);
        s->arr = NULL;
    }

    s->capacity = s->size = 0;
}

对于顺序表的修改比较简单:想要修改某个数值:s->arr[i]=x;即可。

以上就是顺序表的基本内容,希望有所帮助!

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

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

相关文章

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第六:trans_nullmodel class

近几十年来&#xff0c;系统发育分析和零模型的整合通过增加系统发育维度&#xff0c;更有力地促进了生态位和中性影响对群落聚集的推断。trans_nullmodel类提供了一个封装&#xff0c;包括系统发育信号、beta平均成对系统发育距离(betaMPD)、beta平均最近分类单元距离(betaMNT…

【赠书第20期】AI绘画与修图实战:Photoshop+Firefly从入门到精通

文章目录 前言 1 入门篇&#xff1a;初识Photoshop与Firefly 2 进阶篇&#xff1a;掌握Photoshop与Firefly的核心技巧 3 实战篇&#xff1a;运用Photoshop与Firefly进行创作 4 精通篇&#xff1a;提升创作水平&#xff0c;拓展应用领域 5 结语 6 推荐图书 7 粉丝福利 前…

idea 的基本配置

一、安装目录介绍 其中&#xff1a;bin 目录下&#xff1a; 二、配置信息目录结构 这是 IDEA 的各种配置的保存目录。这个设置目录有一个特性&#xff0c;就是你删除掉整个目录之后&#xff0c;重新启动 IntelliJ IDEA 会再自动帮你生成一个全新的默认配置&#xff0c;所以很多…

AI预测福彩3D第11弹【2024年3月17日预测--第2套算法重新开始计算第3次测试】

今天继续开始咱们第2套算法的验证&#xff0c;计划每套算法连续测试10期&#xff0c;达到50%的命中率即为较优的模型&#xff0c;可继续使用。老规矩&#xff0c;先上图表&#xff0c;再下结论~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月17日福彩3D的七码预测结果如下…

理财第一课:炒股词典

文章目录 基础代码规则委比委差量比换手率市盈率市净率 散户亏钱的原因庄家分析炒股战法波浪理论其它 钱者&#xff0c;人生之大事&#xff0c;死生存亡之地&#xff0c;不可不察也。耕田之利&#xff0c;十倍&#xff1b;珠玉之赢&#xff0c;百倍&#xff1b;闹革命&#xff…

Flask vs. Django:选择适合你的Web开发框架【第134篇—Flask vs. Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask vs. Django&#xff1a;选择适合你的Web开发框架 在选择一个适合你项目的Web开发框架…

功能齐全的免费 IDE Visual Studio 2022 社区版

面向学生、开放源代码和单个开发人员的功能齐全的免费 IDE 下载地址 Visual Studio 2022 社区版 - 下载最新的免费版本 Visual Studio 2022 Community Edition – Download Latest Free Version 准备安装 选择需要安装的程序 安装进行中 使用C学习程序设计相关知识并培养编程…

水库大坝安全监测中需要注意的事项

随着经济和社会的发展&#xff0c;水资源的需求也在不断增加。因此&#xff0c;建设水库已成为保障水资源的主要方式之一。然而&#xff0c;随着水库规模的增大和工程的复杂性的增加&#xff0c;水库大坝的安全问题也日益引起重视。为此&#xff0c;需要对水库大坝进行安全监测…

Pretrain-finetune、Prompting、Instruct-tuning训练方法的区别

来自&#xff1a;【多模态】28、LLaVA 第一版 | Visual Instruction Tuning 多模态模型的指令微调_多模态指令跟随数据-CSDN博客 几种模型训练方法的区别&#xff1a; 1、Pretrain-finetune&#xff1a;先在大量数据集上做预训练&#xff0c;然后针对某个子任务做 finetune 2…

System Verilog的接口、程序块与断言解析

接口、程序块与断言 1 接口 1.1 使用接口简化连接 // 接口 interface arb_if(input bit clk);logic [1:0] grant,request;logic rst; endinterface// 使用了简单接口的仲裁器 module arb (arb_if arbif);...always(posedge arbif.clk or posedge arbif.rst)beginif(arbif.rs…

Unity判断某个材质是否拥有某张贴图

在Unity中&#xff0c;一个材质是唯一的&#xff0c;也就是实例&#xff0c;当我们打开Debug面板时&#xff0c;就可以看清楚材质的具体信息。 其中SvaedProperties就是材质保存的属性&#xff0c;当然贴图也是属性&#xff0c;也就是TexEnvs下的属性 当然&#xff0c;要判断某…

ROS2从入门到精通1-1:详解ROS2话题通信机制与自定义消息

目录 0 专栏介绍1 话题通信模型2 话题模型实现(C)3 话题模型实现(Python)4 自定义消息 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 &#x1f680;详情&a…

正则表达式与re模块

目录 正则表达式 简介 语法&#xff1a; 常用元字符&#xff1a; 量词: 贪婪匹配和惰性匹配&#xff1a; re模块 简介&#xff1a; 常用的几个模块&#xff1a; 1.findall 2.search 3.finditer 4.compile 案例展示&#xff1a; 需求&#xff1a; 思路分析&#…

code摘录日记[矩阵变元素,变列向量,3D表面图,table行列设置] Matlab

矩阵变元素&#xff0c;变列向量 W1(Z1 < Z2) nan; % Z1,Z2 all matrix,Only plot points where Z1 > Z2;Z1 < Z2位置值填为NaNx x(:); % Now x is a 30-by-1 vector; matrix变列vector技巧3D表面图 hand figure; % Handle to the figure, for more plotting later…

彻底学会系列:一、机器学习之梯度下降(1)

1 梯度下降概念 1.1 概念 梯度下降是一种优化算法&#xff0c;用于最小化一个函数的值&#xff0c;特别是用于训练机器学习模型中的参数&#xff0c;其基本思想是通过不断迭代调整参数的值&#xff0c;使得函数值沿着梯度的反方向逐渐减小&#xff0c;直至达到局部或全局最小…

python网络编程:通过socket实现TCP客户端和服务端

目录 写在开头 socket服务端&#xff08;基础&#xff09; socket客户端&#xff08;基础&#xff09; 服务端实现&#xff08;可连接多个客户端&#xff09; 客户端实现 数据收发效果 写在开头 近期可能会用python实现一些网络安全工具&#xff0c;涉及到许多关于网络…

供电系统分类详解

一、供电系统分类 电力供电系统一般有5种供电模式&#xff0c;常用的有&#xff1a;IT系统&#xff0c;TT系统&#xff0c;TN系统&#xff0c;其中TN系统又可以分为TN-C&#xff0c;TN-S&#xff0c;TN-C-S。 1、TN-C系统&#xff08;三相四线制&#xff09; 优点: 该系统中…

Hadoop大数据应用:NFS网关 连接 HDFS集群

目录 一、实验 1.环境 2.NFS网关 连接 HDFS集群 3. NFS客户端挂载HDFS文件系统 二、问题 1.关闭服务报错 2.rsync 同步报错 3. mount挂载有哪些参数 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;…

【Mysql基础】查询01-去重、连接字符、模糊查询、通配符、检索表的结构信息

这里写目录标题 1 去重 distinct2 连接字符 concat(str1,str2,...)3 模糊查询3.1 like 包含3.2 通配符3.3 between and3.4 in3.5 is null 4 安全等于 <>5 检索表的结构信息 desc6 课后练习 1 去重 distinct 使用 DISTINCT 关键字&#xff0c;可以从结果集中去除重复的行…

Mac屏幕录制编辑软件

以下是一些Mac平台上受到推荐和好评的屏幕录制编辑软件&#xff1a; OBS Studio&#xff08;免费且开源&#xff09;&#xff1a; OBS 是一款功能强大的免费屏幕录制工具&#xff0c;不仅限于游戏直播&#xff0c;也适用于各种屏幕录制需求。它允许用户捕获屏幕、摄像头、音频&…