【数据结构】一、顺序表的基本操作(C语言)

2023-11-05

顺序表的定义、初始化、创建、打印、按值查找、插入(时间复杂度为O(n))、删除(时间复杂度为O(n))、销毁、合并两个顺序表

#include <stdio.h>
#include <stdlib.h>    //malloc函数会用到此头文件

#define MAX 30;//顺序表元素个数最大为30

//函数声明
void initlist(Sqlist* L);    //初始化顺序表
void createlist(Sqlist* L);    //创建顺序表
void printlist(Sqlist* L);    //打印顺序表
void insertlist(Sqlist* L, int pos, Elemtype e);    //插入操作
void deletlist(Sqlist* L, int pos, Elemtype e);    //删除操作

typedef int Elemtype;    //将Elemtype定义为int类型

//顺序表的定义
typedef struct{
    Elemtype* elem;    //顺序表的元素
    int length;    //顺序表的长度
}Sqlist;    //将Sqlist定义为结构体类型,里面定义了顺序表元素和顺序表的长度两个成员


//初始化顺序表
void initlist(Sqlist* L)
{
    L->elem = (Elemtype*)malloc(sizeof(Elemtype)*MAX);//sizeof(Elemtype)算每个元素大小再*MAX就是整个顺序表的大小,(Elemtype *)表示开辟空间来存什么类型的数
    L->length = 0;    //将顺序表的长度设为0,因为是空表
}
//总结初始化顺序表:
//1.给顺序表分配空间
//2.将表长设为0



//用户输入数据创建顺序表
void createlist(Sqlist* L)
{
    int i,n;
    printf("请输入存放的元素个数:");
    scanf("%d",&n);
    printf("请输入一组数字存到顺序表中:");
    for(i = 0;i < n; i++)
    {
        scanf("%d",&L->elem[i]);    //将输入直接存放到顺序表中
        L->length++;    //每放一个元素,表长+1
    }
}
//总结创建顺序表:
//1.用户输入顺序表的元素个数
//2.用户依次输入顺序表的元素,存入顺序表中
//3.表长+1



//打印顺序表
void printlist(Sqlist* L)
{
    int i;
    for(i = 0; i < L->length; i++)
    {
        printf("%d ",L->elem[i]);
    }
}



//按值查找
void searchlist(Sqlist* L, Elemtype e)
{
    int i;
    for(i = 0; i < L->length; i++)
    {
        if(L->elem[i] == e)
        {
            printf("找到了,下标是%d", i);
        }
    }
}

插入元素:

//插入元素
void insertlist(Sqlist* L, int pos, Elemtype e)//在第pos位置插入元素e,pos是元素的下标
{
    int len = L->length;    //将表长(也就是元素个数)用变量len表示,方便后续书写
    int i;
    if((pos>=0) && (pos < len))    //判断插入位置是否合法,必须插入存放着有元素的下标的位置    
        {
            if(len < MAX)    //判断顺序表元素个数是否已满最大值,已经满了就不能插入元素了
            {
                for(i = len-1; i >= pos; i--)
                {
                    L->elem[i+1] = L->elem[i] //将前一个元素放入后一个下标位置中
                }
                L->elem[pos] = e;    //将要插入的元素插入第pos位置
                L->length++;    //增加元素后,表长+1
            }
        }
}
//总结插入元素:
//1.判断插入位置是否合法
//2.判断表是否已占满
//3.从最后一个元素开始,每次将一个元素向后移动一个位置(其本质是复制元素的值)
//4.将新元素插入指定位置
//5.表长+1

删除元素:

//删除元素
void deletlist(Sqlist* L, int pos, Elemtype e)
{
    int len = L->length;
    int i;
    if((pos >= 0) && (pos < len))
    {
        for(i = pos+1; i < len; i++)
        {
            //将后一个元素放入前一个下标位置中
            L->elem[i-1] = L->elem[i]; //这句第一次写的时候错了,记住是第i个赋值给i-1个
        }
        L->length--;    //删除元素后,表长-1
    }
}
//总结删除元素:
//1.判断删除位置是否合法
//2.从删除指定元素的位置+1开始,将后面的元素每次向前移动一个位置(其本质是复制元素的值)
//3.表长-1

销毁顺序表:

//销毁顺序表
void destorylist(Sqlist* L)
{
    if(L->elem)    //顺序表中存在元素才能销毁
    {
        free(L->elem);    //将空间释放
        L->elem = NULL;  //释放后一定要置为空指针
    }
    L->length = 0;    //表长设为0
}

合并两个顺序表:

新表中可以有重复的数字

 依次取出表A中的一个元素和表B的一个元素比较,哪个元素值小,则将这个元素放到表C的表尾

//将A、B表合并为新表C
void Union(Sqlist A, Sqlist B, Sqlist& C)
{
    //新表C的表长就是A表+B表的表长
    C.length = A.length + B.length;
    //给表C分配内存空间
    C.elem = (int*)malloc(C.length);
    
    //pa、pb、pc分别指向对应的表的第一个元素
    int* pa = A.elem;
    int* pb = B.elem;
    int* pc = C.elem;
    //lasta、lastb分别指向对应的表的最后一个元素
    int* lasta = A.elem + (A.length - 1);
    int* lastb = B.elem + (B.length - 1);

    //判断是否到了表尾,到了表尾退出循环
    while (pa <= lasta && pb <= lastb)
    {
        //A表的元素小于B表的元素,就将A表的元素插入新表里
        if (*pa < *pb)
        {
            //将A表的元素赋值给新表
            *pc = *pa;
            //pa指向下一个元素
            pa++;
            //pc指向下一个元素
            pc++;
            //增加元素后,C表长+1
            C.length++;
        }
        else
        {
            //将B表的元素赋值给新表
            *pc = *pb;
            //pb指向下一个元素
            pb++;
            //pc指向下一个元素
            pc++;
            //增加元素后,C表长+1
            C.length++;
        }
    }

    //A表到了表尾,就将B表剩余元素给C表
    if (pa = lasta)
    {
        while (pb <= lastb)
        {
            //将B表的元素赋值给新表
            *pc = *pb;
            //pb指向下一个元素
            pb++;
            //pc指向下一个元素
            pc++;
            //增加元素后,C表长+1
            C.length++;
        }
    }
    //B表到了表尾,就将A表剩余元素给C表
    else
    {
        while (pa <= lasta)
        {
            //将A表的元素赋值给新表
            *pc = *pa;
            //pa指向下一个元素
            pa++;
            //pc指向下一个元素
            pc++;
            //增加元素后,C表长+1
            C.length++;
        }
    }
    
}

顺序表的优点:1.方法简单,容易实现。2.不用为表示结点间的逻辑关系而增加额外的存储开销(因为是顺序存取的)。3.可按序号随机存取顺序表中的数据元素。

顺序表的缺点:1.插入、删除操作时,平均移动大约表中一半的元素,效率较低。2.需要预先分配存储空间,如果预先分配的空间较大会造成空间浪费,预先分配的空间过小又会造成数据溢出。3.顺序表的存储属于静态存储形式,数据元素的个数不能自由扩充。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】一、顺序表的基本操作(C语言) 的相关文章

  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • 【计算机毕业设计】电影播放平台

    电影播放平台采用B S架构 数据库是MySQL 网站的搭建与开发采用了先进的java进行编写 使用了springboot框架 该系统从两个对象 由管理员和用户来对系统进行设计构建 主要功能包括 个人信息修改 对用户 电影分类 电影信息等功能
  • 【计算机毕业设计】毕业生就业管理微信小程序_lm9q0

    腾讯公司在2017年1月19日发布了一款不需要下载 不需要卸载 不需要存储的软件叫微信小程序 受到了很多人的喜欢 微信小程序自2017年发布至今 依托微信的社交属性和庞大的用户基数 已经渗透到生活的方方面面 1 微信小程序可以将基于微信平台
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 华为OD机试2024年最新题库(Java)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 Java 解法 问
  • Hutool改变我们的coding方式(二)

    Hutool改变我们的coding方式 Hutool 简介 Hutool如何改变我们的coding方式 文档 安装 Maven
  • (2024最新整理)Java最全八股文及答案!

    Java的特点 Java是一门面向对象的编程语言 面向对象和面向过程的区别参考下一个问题 Java具有平台独立性和移植性 Java有一句口号 Write once run anywhere 一次编写 到处运行 这也是Java的魅力所在 而实
  • 计算机Java项目|基于SSM的篮球系列网上商城设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 春眠不觉晓,Java数据类型知多少?基础牢不牢看完本文就有数了

    俺滴座右铭是不在沉默中爆发 就在沉默中灭亡 一起加油学习 珍惜现在来之不易的学习时光吧 等工作之后 你就会发现 想学习真的需要挤时间 厚积薄发啦 我们知道Java是面向对象的静态型编程语言 在Java的世界里万物皆对象 但我认为是万物皆数据
  • 最新整理Java面试八股文,大厂必备神器

    在此 我采访了数十名大厂的面试官和上百的的面试者 总结出了这一套Java面试八股文 这套八股文已经帮助了上百人拿到自己心仪的offer 我们先来看看这套八股文 Java基础面试八股文 操作系统中 heap 和 stack 的区别 什么是基于
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 「优选算法刷题」:快乐数

    一 题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使
  • 【一种新的Burton-Miller型奇异边界方法(BM-SBM)】用于声学设计灵敏度分析,2D和3D声学设计灵敏度分析的奇异边界方法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 2D 2 2 3D
  • 初学者如何快速入门Python(内附详细攻略),一文讲清

    目前python可以说是一门非常火爆的编程语言 应用范围也非常的广泛 工资也挺高 未来发展也极好 Python究竟应该怎么学呢 我自己最初也是从零基础开始学习Python的 给大家分享Python的学习思路和方法 一味的买书看书 看视频 是
  • 学Python,一个月从小白到大神?看你怎么学!

    Python是一门超强大而且超受欢迎的编程语言 它被用在各种领域 比如网站开发 数据分析 人工智能和机器学习 学会Python会给你创造很多职业机会 所以绝对是值得一试的 但你有没有过这样的梦想 一个月时间 从Python小白变成Pytho
  • 【js学习之路】遍历数组api之 `filter `和 `map`的区别

    一 前言 数组是我们在项目中经常使用的数据类型 今天我们主要简述作用于遍历数组的api filter 和 map 的区别 二 filter和map的共同点 首先 我们主要阐述一下 filter 和 map 的共同点 api的参数都是回调函数
  • Java开发中不要使用受检异常

    简介 Java是唯一 主流 实现了受检异常概念的编程语言 一开始 受检异常就是争议的焦点 在当时被视为一种创新概念 Java于1996年推出 如今却被视不良实践 本文要讨论Java中非受检异常和受检异常的动机以及它们优缺点 与大多数关注这个

随机推荐

  • USB转RS485串口电路设计

    USB转串口芯片的串口信号一般为 TTL CMOS电平 在实现半双工 RS485 串口时需要外接485电平转换芯片 设计中需要有信号来控制 485 转接芯片的发送和接收使能端 建议选择自带485控制引脚的转接芯片 如 CH340 CH342
  • MybatisPlus中removeById删除数据库未变

    removeById Serializable id 传入的是id Integer Long等 不是实体对象 就是对应你表的主键 由于我刚开始建表时未设置主键mybatisplus自动生成未在实体类表中标注主键 后加了主键 所以需在实体类主
  • 各种遥感数据,地理信息数据共享网站

    各种遥感数据 地理信息数据共享网站 至少一百 Online Global Satellite Image and Atlas http library gmu edu resources sci Geog579 htm 可以下载Aster
  • Java开发中的23种设计模式详解

    设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可
  • word怎么让封面、目录没有页码,页码从正文开始

    word怎么让封面 目录没有页码 页码从正文开始 1 开始插入页码 从第一页开始 如图 二 如果前两页是封面和目录 再从第一页开始就不合适了 解决步骤如下 1 在第三页的文字前面添加分页符 效果如图 2 选中第三页的页码 跳到设置页眉页脚的
  • Windows powershell增设快捷指令(Git版)

    1 创建并修改Windows Powershell 启动执行文件 echo PROFILE 输出的是powershell的执行文件路径 2 切换到WindowPowerShell路径下 创建文件 Microsoft PowerShell p
  • MySQL 数据类型

    目录 数据类型 数据类型分类 数值类型 bit类型 小数类型 float decimal 字符串类型 char varchar char和varchar比较 日期和时间类型 enum和set 集合查询使用find in set函数 afte
  • 【学习总结】EasyExcel合并同列不同行,表格数据相同的行

    实体类 Data HeadRowHeight 50 ContentStyle horizontalAlignment HorizontalAlignmentEnum CENTER verticalAlignment VerticalAlig
  • zookeeper 入门(一)单机zk

    topic 1 单机zk搭建 连接zk服务创建节点 以下简称zookeeper 为zk 我的操作环境 mac os jdk8 zookeeper 3 4 12 1 下载zk到本地 解压 tar zxvf zookeeper 3 4 12 t
  • [html]js无缝循环滚动图片示例代码

    html代码 div ul li a href YunNan html img src 微信图片 20200621003327 jpg 1 a li li a href Switzerland html img src 微信图片 20200
  • muduo源码分析2——Singleton分析

    1 一般singleton写法 单例模式即要求只有在第一次调用的时候创建该对象 主要分为以下两条路 返回指针还是引用 返回引用可以防止使用中delete instance导致对象被提前销毁 private包含static指针以及构造函数 p
  • thinkphp 中 使用七牛云上传(来自thinkphp官网)

    利用七牛云私有空间存储文件 第一步 注册七牛云 创建空间 将空间设为私有 需要记下的东西 AK SK bucket 第二步配置ThinkPHP 在config php添加 UPLOAD SITEIMG QINIU gt array maxS
  • 电脑提示‘您需要来自Administration的权限才能对此文件夹进行更改’怎么删除文件...

    电脑提示 您需要来自Administration的权限才能对此文件夹进行更改 怎么删除文件 应该怎么做 win7系统需要定期删除一些无用的文件 扩大内存空间 但是在删除文件的时候弹出提示 您需要来自Administrators的权限才能对此
  • llvm libLLVMCore源码分析 02 - Value Class

    源码路径 llvm include llvm IR Value h llvm include llvm IR ValueHandle h llvm Value Class 在llvm中 Value类是所有程序计算出的值的类 如Argumen
  • 一个外国的好网站 http://www.ilovejackdaniels.com/

    正则表达式大区 魔兽快捷键 呵呵 转载于 https www cnblogs com yamajia archive 2007 12 04 981843 html
  • Hive 基础知识

    目录 1 基础概念 1 1 定义 1 2 组件 1 3 元数据 1 4 内部表和外部表 2 Hive与关系型数据库的对比 3 Hive 数据存储 4 参考文献 1 基础概念 1 1 定义 Hive是一个基于Hadoop的数据仓库基础设施工具
  • notepad++安装十六进制插件备注

    notepad 安装十六进制插件备注 notepad 下载地址 https notepad plus plus org notepad 16进制插件下载位置 https github com chcg NPP HexEdit release
  • QKL123

    作者 QKL123 QKL123区块链排行榜包括区块链项目 区块链交易平台 区块链媒体 区块链公众号 区块链矿机 区块链矿池 EOS Dapp ETH Dapp 区块链钱包九大榜单 相对第二期 2019年02月 榜单 该期首次新增ETH D
  • java JDWP调试接口任意命令执行漏洞

    点击 仙网攻城狮 关注我们哦 不当想研发的渗透人不是好运维 让我们每天进步一点点 简介 JDWP Java DEbugger Wire Protocol 即Java调试线协议 是一个为Java调试而设计的通讯交互协议 它定义了调试器和被调试
  • 【数据结构】一、顺序表的基本操作(C语言)

    顺序表的定义 初始化 创建 打印 按值查找 插入 时间复杂度为O n 删除 时间复杂度为O n 销毁 合并两个顺序表 include