数据结构--顺序表的基本操作--插入 and 删除

2023-11-08

数据结构–顺序表的基本操作–插入

顺序表的插入操作

实现目标

ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。

typedef struct
{
    int data[MaxSize];
    int len;
}Sqlist;

代码实现:

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 //定于的最大长度

typedef struct
{
    int data[MaxSize];
    int len;
}Sqlist;
void InitList(Sqlist &L)
{
    L.len = 0;
}
bool ListInsert(Sqlist &L, int idx, int e)
{
    if (idx > L.len + 1 || idx < 1) //判断是否合法
        return false;
    if (L.len >= MaxSize)
        return false;

    for (int j = L.len; j >= idx; j--) //将第idx个元素及之后的元素后移
        L.data[j] = L.data[j - 1];  
    L.data[idx - 1] = e;    //在位置i处放入e
    L.len++;    //长度加1
    return true;
}
int main()
{
    Sqlist L;
    InitList(L);
    if (ListInsert(L, 1, 1))
        printf("Inserted successfully\n");
    if (ListInsert(L, 2, 2))
        printf("Inserted successfully\n");
    // 测试结果
    for (int i = 0; i < L.len; i++)
        printf("%d ", L.data[i]);
}

ps:
好的算法,应该具有“健壮性”能处理异常情况,并给使用者反馈。

时间复杂度

最好情况:新元素插入到表尾,不需要移动元素 idx = n+1,循环0次;
最好时间复杂度 \color{red}最好时间复杂度 最好时间复杂度=O(1)
最坏情况:新元素插入到表头,需要将原有的n个元素全都向后移动 idx= 1,循环n次;
最坏时间复杂度 \color{red}最坏时间复杂度 最坏时间复杂度= O(n);
平均情况:假设新元素插入到任何一个位置的概率相同,即idx= 1,2,3, … len+1的概率都是 p = 1 n + 1 p=\frac{1}{n+1} p=n+11 idx = 1,循环n次;idx=2时,循环n-1次; idx=3,循环n-2次…idx=n+1时,循环0次
平均循环次数 = n p + ( n − 1 ) p + ( n − 2 ) p + . . . + 1 p = n ( n + 1 ) 2 × 1 n + 1 = n 2 np + (n-1)p + (n-2)p + ... + 1p = \frac{n(n + 1)}{2} \times \frac{1}{n + 1} = \frac{n}{2} np+(n1)p+(n2)p+...+1p=2n(n+1)×n+11=2n
平均时间复杂度 \color{red}{平均时间复杂度} 平均时间复杂度 = O(n)

顺序表的删除操作

实现目标

ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

代码实现

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 //定于的最大长度

typedef struct
{
    int data[MaxSize];
    int len;
}Sqlist;
void InitList(Sqlist &L)
{
    L.len = 0;
}
bool ListInsert(Sqlist &L, int idx, int e)
{
    if (idx > L.len + 1 || idx < 1) //判断是否合法
        return false;
    if (L.len >= MaxSize)
        return false;

    for (int j = L.len; j >= idx; j--) //将第idx个元素及之后的元素后移
        L.data[j] = L.data[j - 1];  
    L.data[idx - 1] = e;    //在位置i处放入e
    L.len++;    //长度加1
    return true;
}
bool ListDelete(Sqlist &L, int idx, int &e)
{
    if (idx > L.len && idx < 1) //判断i的范围是否有效
        return false;
    e = L.data[idx - 1];    //将被删除的元素赋值给e
    for (int j = idx - 1; j < L.len; j++)   //将第i个位置后的元素前移
        L.data[j] = L.data[j + 1];
    L.len--;    //线性表长度减1
    return true;
}
int main()
{
    Sqlist L;
    InitList(L);
    if (ListInsert(L, 1, 1))
        printf("Inserted successfully\n");
    if (ListInsert(L, 2, 2))
        printf("Inserted successfully\n");
    int e = -1;
    if (ListDelete(L,1,e))
        printf("Deleted successfully\n");
    // 测试结果
    for (int i = 0; i < L.len; i++)
        printf("%d ", L.data[i]);
}

时间复杂度

最好情况:删除表尾元素,不需要移动其他元素 idx= n 循环0次;
最好时间复杂度 \color{red}最好时间复杂度 最好时间复杂度=O(1)
最坏情况:删除表头元素,需要将后续的n-1个元素全都向前移动 idx= 1,循环 n-1 次;
最坏时间复杂度 \color{red}最坏时间复杂度 最坏时间复杂度= O(n);
平均情况:假设删除任何一个元素的概率相同,即 idx= 1,2,3. … , len的概率都是 p = 1 n p=\frac{1}{n} p=n1
idx = 1,循环 n-1 次; idx=2 时,循环n-2次; idx=3,循环n-3 次… idx = n 时,循环 0 次
平均循环次数 = ( n − 1 ) p + ( n − 2 ) p + . . . . . . + 1 p = n ( n − 1 ) 2 × 1 n = n − 1 2 (n-1)p+(n-2)p+......+1p = \frac{n(n-1)}{2} \times \frac{1}{n} = \frac{n-1}{2} (n1)p+(n2)p+......+1p=2n(n1)×n1=2n1
平均时间复杂度 \color{red}平均时间复杂度 平均时间复杂度 = O(n)

知识点回顾与重要考点

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

数据结构--顺序表的基本操作--插入 and 删除 的相关文章

随机推荐

  • 【Linux】利用云服务器搭建云盘替代百度网盘、OneDrive等,docker安装seafile服务端,实现网页端上传下载,本地Linux、Windows安装客户端实时同步

    写在前面 博主使用OneDrive比较多 教育版有1t的大小 但是由于OneDrive在Linux系统中通过API不能连接学校的教育版 因此迫切需要一个云盘来替代OneDrive 由于之前也使用过Seafile 因此考虑使用Seafile搭
  • 编辑器正则替换px为rem

    正则部分 d d px 被替换部分 calc 1rem 100 注 此方法只能替换原css文件内无calc 运算的
  • 关于Unicode,UTF-8,GB编码详解

    内容来自网络 有部分修正 一 首先我们需要明白关于字符 character 字符集 character set 字符编码方式 character encoding 的概念 字符 字符是抽象的最小文本单位 它没有固定的形状 可能是一个字形 而
  • [901]sqlite数据库的导出与导入

    文章目录 SQLite 获取所有表名 通过 sqlite3 test db 命令进入sqlite数据库的shell 操作 python 脚本 help 直接导出csv文件 SQLite 仅仅支持 ALTER TABLE 语句的一部分功能 我
  • ansible常用模块使用方法

    ansible playbook执行方法 这个是你选择的主机 hosts webservers 这个是变量 vars http port 80 max clients 200 远端的执行权限 remote user root tasks 如
  • 实战技术产品经理

    文章转自 人人都是产品经理 并不代表企业实战 工具使用 办公工具的使用比如AXURE OFFICE 云笔记 PS等 决定办公效率 系统熟练 对后端数据及前端设计规范的了解程度 决定验收能力和设计合理度 沟通表达 对开发跟进及资源争取方面的推
  • 【强化学习】

    强化学习DQN 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 强化学习DQN DQN算法的简介 一 环境的介绍 二 DQN算法 1 DQN算法的关键技术 2 DQN代码 2 1 导入库 2 2 定义类 2 3
  • Ubuntu 22.04.3 LTS安装

    最近换电脑了 准备重新装一下ubuntu 多年前装过ubuntu很老的版本 现在发现官网最新的LTS版本是 Ubuntu 22 04 3 LTS 版本 那重新装的话 肯定装最新的版本了 这里我记录下自己的安装过程 作为以后的笔记查看 我的环
  • Android 添加开启/关闭应用信息界面的接口

    修改记录 mt67xx 11 0 应用信息界面是个Fragment不是Activity 不能用pm setComponentEnabledSetting方法做禁用 a alps vendor mediatek proprietary pac
  • oracle 12.2.0.1 opatch lsinventory时报LsInventorySession failed: RawInventory gets null OracleHomeInfo

    grid node1 opatch lsinventory detail oh u01 app 12 2 0 grid Oracle Interim Patch Installer version 12 2 0 1 25 Copyright
  • Socks5代理:网络安全与爬虫之利器

    一 Socks5代理 简介与工作原理 Socks5代理 全称为Socket Secure 5代理 是一种允许用户通过代理服务器进行网络连接的技术 它是Socks协议的最新版本 在网络安全和数据传输方面有着显著的优势 Socks5代理与其他代
  • `计算机知识` 驱动程序

    catalog 驱动 全称为 设备驱动程序 Device driver 首先 我们的计算机 是无法直接和 外部硬件设备 显卡 声卡 进行通信的 因为 我们的计算机 OS 编程语言 使用的是 代码 而外部硬件设备 识别的是 电子信号 这两个是
  • 基于Java的学生管理系统

    学生管理系统ManageSystem 一 系统架构与环境 1 1 springboot2 3 4 1 2 maven3 3 9 1 3 jdk1 8 1 4 mysql5 7 1 5 ssm架构单服务节点 二 具备的功能 1 用户管理 2
  • Digital Ocean 搭建属于自己的网站

    首先 需要Digital Ocean账号申请以及环境搭建的参考博客 https blog csdn net hunzhangzui9837 article details 85209245 下面 开始Digital Ocean 网站搭建 1
  • 内存单位及换算

    单位换算 内存单位及换算 位 bit 数据储存最小单位 字节 Byte 基本数据存储单位 内存单位及换算 换算单位太多 记下来供查阅 位 bit 二进制一个数字 0或1 即是一位 数据储存最小单位 字节 Byte 每8位为一个字节 1Byt
  • Vue Element Form表单 resetFields重置无效

    原因有两点 el form 标签需要绑定 ref 和 model 属性 el form item 标签要绑定 prop 属性 重置表单 添加一个是否加载的开关 v if dialogVisible 由 dialogVisible的值来 控制
  • chatgpt赋能python:Python量化数据来源-介绍

    Python量化数据来源 介绍 Python在金融量化分析领域中得到了广泛的应用 这部分应用通常被称为Python量化金融 Python量化数据来源是Python量化金融分析的基础 只有良好的数据来源才能保证分析的准确性和有效性 Pytho
  • Python图形界面的设计,Turtle库的使用

    一 学习目标 1 Turtle库的简介 2 调用Turtle库 3 绘画起点和方向 4 画布 二 知识点 1 Turtle库的简介 Turtle库是Python语言中一个很流行的绘图图像函数库 中文意思是甲鱼 海龟 所以也称为海龟库 Tur
  • Anaconda安装路径和包路径问题

    文章目录 Anaconda的安装路径 使用pip install 下载后的包的路径在哪里 Anaconda的安装路径 在默认情况下 Anaconda安装的默认路径是C ProgramData Anaconda3 而conda环境的默认安装路
  • 数据结构--顺序表的基本操作--插入 and 删除

    数据结构 顺序表的基本操作 插入 顺序表的插入操作 实现目标 ListInsert L i e 插入操作 在表L中的第i个位置上插入指定元素e typedef struct int data MaxSize int len Sqlist 代