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

目录

顺序表的基本概念

动态顺序表的实现

初始化

插入

尾插法

头插法

指定位置之前插入

删除

尾删法

头删法

指定位置删除

查找

销毁


顺序表的基本概念

什么是顺序表?

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

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

顺序表的分类:

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

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

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;即可。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

树与二叉树(数据结构)

本篇博客讲解 树与二叉树&#xff0c;后续会继续讲解堆 —————————————————————— 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看…

浅谈C++的函数重载

今天我们来谈谈C的函数重载&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;对于函数重载&#xff0c;我们首先需要理解几个问题&#xff1a; 1、什么是函数重载 &#xff1f;2、函数重载需要注意什么 &#xff1f;3、为什么C语言不支持函数重载&#xff0c;而C支持 &…

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状&#xff0c;可自由动态更改画线的粗细、拐角圆滑度、颜色&#xff0c;自由增减节点&#xff0c;不额外增加gameobject&#xff0c;并且在原生的UGUI上以ScreenSpace-Overlay的状态下&#xff0c;显示效果如下所示 …

【PyTorch】基础学习:一文详细介绍 load_state_dict() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 load_state_dict() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#…

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz&#xff0c;可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端&#xff0c;输入以下命令更新软件包列表&#xff1a;sudo apt update。之后&#xff0c;使用命令sudo apt install graphviz来安装Graphviz软件包。为…

使用 GitHub Actions 通过 CI/CD 简化 Flutter 应用程序开发

在快节奏的移动应用程序开发世界中&#xff0c;速度、可靠性和效率是决定项目成功或失败的关键因素。持续集成和持续部署 (CI/CD) 实践已成为确保满足这些方面的强大工具。当与流行的跨平台框架 Flutter 和 GitHub Actions 的自动化功能相结合时&#xff0c;开发人员可以创建无…

网络安全实训Day5

写在前面 昨天忘更新了......讲的内容不多&#xff0c;就一个NAT。 之前记的NAT的内容&#xff1a;blog.csdn.net/Yisitelz/article/details/131840119 网络安全实训-网络工程 NAT 公网地址与私网地址 公网地址 可以在互联网上被寻址&#xff0c;由运营商统一分配全球唯一的I…

GAN及其衍生网络中生成器和判别器常见的十大激活函数(2024最新整理)

目录 1. Sigmoid 激活函数 2. Tanh 激活函数 3. ReLU 激活函数 4. LeakyReLU 激活函数 5. ELU 激活函数 6. SELU 激活函数 7. GELU 激活函数 8. SoftPlus 激活函数 9. Swish 激活函数 10. Mish 激活函数 激活函数(activation function)的作用是对网络提取到的特征信…

字母异位词分组【每日一题】

可以通过案例找到规律&#xff0c;每个词排序完后是同一个&#xff0c;所以通过hasmap存储排序过的值做key&#xff0c;值是存储单词集合。 package HasTable;import java.util.*;class Solution {static List<List<String>> groupAnagrams(String[] strs) {Map&l…

(官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell

前言 查了很多资料都不靠谱&#xff0c;在安装过程中遇到很多的坑&#xff0c;mangoDB 服务重视起不来&#xff1b;出现了很多难以解决的报错&#xff0c;现在把安装过程中遇到的问题&#xff0c;和如何闭坑说一下&#xff0c;很多时候都是准备工作不足导致的&#xff1b;很多方…

瑞_Redis_短信登录_Redis代替session的业务流程

文章目录 项目介绍1 短信登录1.1 项目准备1.2 基于Session实现登录流程1.3 Redis代替session的业务流程1.3.1 设计key的结构1.3.2 设计key的具体细节1.3.3 整体访问流程1.3.4 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的R…

论文阅读_参数微调_P-tuning_v2

1 P-Tuning PLAINTEXT 1 2 3 4 5 6 7英文名称: GPT Understands, Too 中文名称: GPT也懂 链接: https://arxiv.org/abs/2103.10385 作者: Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, Jie Tang 机构: 清华大学, 麻省理工学院 日期: 2021-03-18…

电脑文件误删除如何恢复?分享三个简单数据恢复方法

在日常使用电脑的过程中&#xff0c;文件误删除的情况时有发生。无论是由于操作失误还是病毒感染&#xff0c;丢失的文件都可能对我们的工作和学习造成极大的影响。因此&#xff0c;掌握文件恢复的方法显得尤为重要。下面围绕“电脑文件误删除如何恢复”这一主题&#xff0c;给…

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6&#xff0c;宝塔面板&#xff0c;PHP 7.4和MySQL 5.6。网站的根目录是public&#xff0c; 使用thinkPHP进行伪静态处理&#xff0c;并已开启SSL证书。 该系统具有多种功能&#xff0c;包括文章改写、广告营销文案创作、编程助手、办公达人…

AI 初创公司趋势:Y Combinator 最新批次的见解

总部位于硅谷的著名创业加速器 Y Combinator (YC) 最近宣布了其 2023 年冬季队列&#xff0c;不出所料&#xff0c;约 31% 的初创公司&#xff08;269 家中有 80 家&#xff09;拥有自我报告的 AI 标签。在这篇文章中&#xff0c;我分析了这批 20-25 家初创公司&#xff0c;以了…

kafka集群介绍

介绍 kafka是一个高性能、低延迟、分布式的消息传递系统&#xff0c;特点在于实时处理数据。集群由多个成员节点broker组成&#xff0c;每个节点都可以独立处理消息传递和存储任务。 路由策略 发布消息由key、value组成&#xff0c;真正的消息是value&#xff0c;key是标识路…

【C语言】九九乘法表

1&#xff0c;确定每一行何时结束 2&#xff0c;确定该定义哪些变量&#xff08;i,j&#xff09; 3&#xff0c;确定变量该如何取值&#xff08;1~9&#xff09; 代码如下&#xff1a; #include<stdio.h> int main() { for (int i 1;i < 9;i) { for (…

LabVIEW提升舱救援通讯监测系统

LabVIEW提升舱救援通讯监测系统 随着科技的进步&#xff0c;煤矿救援工作面临着许多新的挑战。为了提高救援效率和安全性&#xff0c;设计并实现了一套基于LabVIEW的提升舱救援通讯监测系统。该系统能够实时监控提升舱内的环境参数和视频图像&#xff0c;确保救援人员和被困人…

使用map和set实现简单的词频统计

一、运行效果图 二、代码示例 #include <iostream> #include <fstream> #include <sstream> #include <string> #include <map> #include <set> #include <vector> #include <algorithm> using namespace std;class TextQuer…

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…