顺序表的插入、删除和查找(四)

简介: 详细介绍了数据结构中的顺序表

网络异常,图片无法展示
|

顺序表

用顺序存储的方式实现线性表顺序存储,把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

计算一个数据元素的大小: C语言中提供的一个函数sizeof(Elem Type) eg:

sizeof(int) = 4B

当然一个结构体的数据元素也可以算出来

typedef struct {
    int num;
    int people;
} Customer
sizeof(Customer) = 8B

顺序表的静态分配

define定义中的MaxSize决定了最大数组的长度,

#define MaxSize 10 //定义最大长度
typedef struct{
    ElemType data[MaxSize]; //用静态的“数组”存放数据元素
    int length //顺序表当前长度
}SqList;  //顺序表的类型定义(静态分配方式)

初始化一个顺序表

void InitList(SqList $L){
    L.length=0;   //顺序表初始长度为0
}

静态的顺序表当被声明后就不容易被修改

顺序表的动态分配

#define MaxSize 10 //定义最大长度
typedef struct{
    ElemType *data; //指针动态分配数组的指针
    int MaxSize;  //顺序表最大容量
    int length //顺序表当前长度
}SqList;  //顺序表的类型定义(动态分配方式)

c语言中的malloc、free函数分别可以动态的申请和释放内存空间,malloc函数返回一个指针,需要强制转性为你定义的数据元素类型指针;在c++中可以用new、delete这两个关键字来实现

L.data=(ElemType *) malloc(sizeof(ElemType *InitSize))

顺序表的插入

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

实现的基本思路就是把原L中第i个元素及之后的元素后移

void ListInsert(SqList $L,int i,int e){
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
}

在实现的过程中需要判断i是否是合法的,同时要考虑顺序表的长度。改进后的代码:

void ListInsert(SqList $L,int i,int e){
    if(i<1 || i>L.length+1)  //判断i是否合法
        return false;
    if(L.length>=MaxSize)  //储存空间已满,不能插入
        return false;
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
    return true;
}

时间复杂度:

  • 最好情况:新元素插入到表尾,不用移动元素,T(n)= O(1)
  • 最坏情况:新元素插入到表头,T(n)= O(n)
  • 平均情况:T(n)= O(n)

顺序表的删除

bool ListDelete(SqList $L, int i.int &e){
    if(i<1 || i>L.length)   //判断i是否合法
        return false;
    e=L.data[i-1];          //删除的元素赋给e
    for(int j=i;j<L.length;j++)     //将第i个位置后的元素前移
        L.data[j-1]=L.data[j];
    L.length--;    //线性表的长度减1
    retrun true;
}

时间复杂度:

  • 最好情况:删除表尾元素,不用移动元素,T(n)= O(1)
  • 最坏情况:删除表头元素,将n+1个元素全部向前移动,T(n)= O(n)
  • 平均情况:T(n)= O(n)

顺序表的查找

按位查找

GetElem(L,i):按位查找操作,获取表L中的第i个位置的元素的值

ElemType  GetElem(SeqList L, int i){
    return L.data[i-1];
}

时间复杂度:T(n)=O(n)

按值查找

LocateElem(L,e):按值查找操作,在表L中查找具有给定关键字值的元素

int LocateElem(SeqList L, ElemType e){
    for(int i=0; i<L.length; i++)
        if(L.data[i]==e)
            return i+1;
    return 0;
}

在顺序表L中查找第一个元素值等于e的元素,并返回其位序,当数组中的下标为i的元素的值等于e的时候,返回位序i+1

时间复杂度:T(n)=O(n)

目录
相关文章
|
安全 Ubuntu 关系型数据库
Ubuntu下MySQL无法启动和访问的问题解决与修复
Ubuntu下MySQL无法启动和访问的问题解决与修复
1823 1
Ubuntu下MySQL无法启动和访问的问题解决与修复
|
druid Java 数据库连接
|
9月前
|
机器学习/深度学习 监控 数据可视化
提升数据科学工作流效率的10个Jupyter Notebook高级特性
Jupyter Notebooks 是数据科学家和Python开发人员的核心工具,提供代码执行、文本编辑和数据可视化的无缝整合。本文介绍其高级功能,如Magic命令优化代码执行、IpyWidgets增强交互性、自动重载模块更新、内联文档系统、可折叠标题、nbconvert多格式转换、变量监控、JupyterLab集成开发环境、终端集成和调试系统等,助您提升工作效率并充分发挥Jupyter的潜力。
386 22
|
9月前
|
存储 人工智能 安全
基于区块链的数字身份认证:重塑身份安全的新范式
基于区块链的数字身份认证:重塑身份安全的新范式
1044 16
|
运维 监控 负载均衡
什么是系统可用性?如何提升可用性?
本文探讨了系统可用性的概念、计算方法及其重要性。可用性指系统能在预定时间内正常运行的比例,计算公式为:(运行时间)/(运行时间+停机时间)。文章列举了不同级别的可用性对应的停机时间,并介绍了提升系统可用性的多种策略,包括冗余设计、故障检测与自动恢复、数据备份与恢复、负载均衡、容错设计、定期维护与更新及使用高可用性云服务和网络优化。这些措施有助于构建更加稳定可靠的系统。
1887 0
|
10月前
|
存储 缓存 关系型数据库
MySQL的count()方法慢
MySQL的 `COUNT()`方法在处理大数据量时可能会变慢,主要原因包括数据量大、缺乏合适的索引、InnoDB引擎的设计以及复杂的查询条件。通过创建合适的索引、使用覆盖索引、缓存机制、分区表和预计算等优化方案,可以显著提高 `COUNT()`方法的执行效率,确保数据库查询性能的提升。
1333 12
|
SQL 关系型数据库 数据库
使用 PostgreSQL 和 Python 实现数据库操作
【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现数据库操作
|
11月前
|
存储 运维 Kubernetes
云原生之旅:Kubernetes的弹性与可扩展性探索
【10月更文挑战第32天】在云计算的浪潮中,云原生技术以其独特的魅力成为开发者的新宠。本文将深入探讨Kubernetes如何通过其弹性和可扩展性,助力应用在复杂环境中稳健运行。我们将从基础架构出发,逐步揭示Kubernetes集群管理、服务发现、存储机制及自动扩缩容等核心功能,旨在为读者呈现一个全景式的云原生平台视图。
119 1
|
机器学习/深度学习 安全 算法
基于YOLOv8深度学习的100种中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码】目标识别、深度学习实战
基于YOLOv8深度学习的100种中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码】目标识别、深度学习实战
基于YOLOv8深度学习的100种中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码】目标识别、深度学习实战
|
存储 NoSQL 分布式数据库
【HBase入门与实战】一文搞懂HBase!
该文档介绍了HBase,一种高吞吐量的NoSQL数据库,适合处理大规模数据。HBase具备快速读写、列式存储和天然支持集群部署的特点,常用于高并发场景。NoSQL与关系型数据库的主要区别在于数据模型、查询语言和可伸缩性。HBase的物理架构包括Client、Zookeeper、HMaster和RegionServer,其中RegionServer管理数据存储。HBase的读写流程利用MemStore和Bloom Filter提高效率。此外,文档还提到了HBase的应用,如时间序列数据、消息传递和内容服务。
2864 1
【HBase入门与实战】一文搞懂HBase!