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

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

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

顺序表

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

计算一个数据元素的大小: 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无法启动和访问的问题解决与修复
1865 1
Ubuntu下MySQL无法启动和访问的问题解决与修复
|
druid Java 数据库连接
|
8月前
|
移动开发 小程序
【02】支付宝支付商户申请下户到配置完整流程-申请签约产品-添加应用审核-设定经营类目-填写网站备案信息-申请+配置完整流程-优雅草卓伊凡
【02】支付宝支付商户申请下户到配置完整流程-申请签约产品-添加应用审核-设定经营类目-填写网站备案信息-申请+配置完整流程-优雅草卓伊凡
266 0
【02】支付宝支付商户申请下户到配置完整流程-申请签约产品-添加应用审核-设定经营类目-填写网站备案信息-申请+配置完整流程-优雅草卓伊凡
|
10月前
|
机器学习/深度学习 监控 数据可视化
提升数据科学工作流效率的10个Jupyter Notebook高级特性
Jupyter Notebooks 是数据科学家和Python开发人员的核心工具,提供代码执行、文本编辑和数据可视化的无缝整合。本文介绍其高级功能,如Magic命令优化代码执行、IpyWidgets增强交互性、自动重载模块更新、内联文档系统、可折叠标题、nbconvert多格式转换、变量监控、JupyterLab集成开发环境、终端集成和调试系统等,助您提升工作效率并充分发挥Jupyter的潜力。
403 22
|
10月前
|
存储 人工智能 安全
基于区块链的数字身份认证:重塑身份安全的新范式
基于区块链的数字身份认证:重塑身份安全的新范式
1116 16
|
运维 监控 负载均衡
什么是系统可用性?如何提升可用性?
本文探讨了系统可用性的概念、计算方法及其重要性。可用性指系统能在预定时间内正常运行的比例,计算公式为:(运行时间)/(运行时间+停机时间)。文章列举了不同级别的可用性对应的停机时间,并介绍了提升系统可用性的多种策略,包括冗余设计、故障检测与自动恢复、数据备份与恢复、负载均衡、容错设计、定期维护与更新及使用高可用性云服务和网络优化。这些措施有助于构建更加稳定可靠的系统。
2022 0
|
消息中间件 前端开发 安全
第三方数据平台技术选型分析
这篇文章分析了第三方数据平台的技术选型,涵盖了移动统计平台、自助分析平台和BI平台的不同代表厂商,讨论了它们的数据源、使用要求和适用场景。
573 2
|
机器学习/深度学习 安全 算法
基于YOLOv8深度学习的100种中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码】目标识别、深度学习实战
基于YOLOv8深度学习的100种中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码】目标识别、深度学习实战
基于YOLOv8深度学习的100种中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码】目标识别、深度学习实战
|
机器学习/深度学习 运维 自然语言处理
探索机器学习在金融欺诈检测中的应用
【5月更文挑战第3天】 随着金融科技的迅猛发展,机器学习作为其核心推动力之一,正逐渐改变着我们对金融服务安全与效率的理解。本文将深入探讨机器学习技术在金融欺诈检测领域内的应用现状与前景。通过分析多种算法和实际案例,我们揭示了如何利用机器学习提高识别欺诈行为的准确率,降低金融机构的风险损失。同时,文章还将讨论在此过程中遇到的挑战及未来的发展趋势,为读者提供一个全面而深入的视角。
|
算法 调度
【完全复现】基于改进粒子群算法的微电网多目标优化调度
该文档描述了一个使用改进粒子群算法实现的微电网多目标优化调度的Matlab程序。该模型旨在最小化运行成本和环境保护成本,将多目标问题通过权值转换为单目标问题解决。程序中定义了决策变量,如柴油发电机、微型燃气轮机、联络线和储能的输出,并使用全局变量处理电负荷、风力和光伏功率等数据。算法参数包括最大迭代次数和种群大小。代码调用了`PSOFUN`函数来执行优化计算,并展示了优化结果的图表。