数据结构知识点总结-线性表(1)-线性表的定义、基本操作、顺序表表示

news2025/1/18 10:47:01

线性表

定义

        线性表是具有相同数据类型的N(N>=0)个元素的有限序列,其中N为表长,当N=0时线性表是一张空表。

        线性表的逻辑特征:每个非空的线性表都有一个表头元素和表尾元素,中间的每个元素有且仅有一个直接前驱,有且仅有一个直接后继。

        线性表是一种逻辑结构,表示元素之间一对一相邻的关系。顺序表(数组)和链表是指存储结构,两者属于不同的层面。

线性表的基本操作

        基本操作的实现取决于采用哪种存储结构,存储结构不同,算法实现也不同,比如底层采用数据实现和链表实现,对应的代码不一样,但在上层实现算法逻辑时不关心底层具体实现,上述方法名可以直接作为伪代码使用。

线性表的顺序表示

(1)顺序表定义

# define MaxSize 50  // 定义线性表的最大长度

typedef int ElemType;

typedef struct{

     ElemType  data[MaxSize] ;    // 顺序表的元素

     int   length ;                  // 顺序表的当前长度

} SqList;                            // 别名

        线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

        顺序表可以是静态分配的数组,也可以是动态分配的数组。如果采用动态分配,就是在使用时按照实际大小申请空间。

#define InitSize 100

typedef struct {

     ElemType   *data ;        // 指示动态分配数组的指针

     int  MaxSize , length ;  // 数组的最大容量和当前个数

}SeqList;                      // 动态分配数组顺序表的类型定义

C语言初始化:L.data = (ElemType *) malloc (sizeof(ElemType) * InitSize);

C++初始化:  L.data = new ElemType[InitSize] ;

注意:动态分配并不是链式存储,同样还是属于顺序存储结构,其物理结构没有变化,依然是随机存取方式,只是分配的空间大小可以在运行时决定。

(2)顺序表的特点

顺序表最主要的特点是:随机访问,即通过首地址和元素序号可以在O(1)时间内找到指定的元素

顺序表的存储密度高,每个结点只存储数据元素,相对于链表来说没有指针域。

顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动元素。

顺序表基本操作

有效性校验、边界检查:

如下面代码的“判断 i 的范围是否有效”。在函数体前面,主代码运行之前,对数据的有效性进行检查,比如是否为空、是否越界等。体现代码的健壮性,完整性,在考试时如果能多这一步并加上注释,是加分项。

1)顺序表的插入代码实现

// 本算法实现将元素 e 插入到顺序表 L 中第 i 个位置
bool  ListInsert( SqList   &L  , int i , ElemType 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--){      //将 第 i 个元素及之后的元素后移
        L.data[ j ] = L.data[ j-1 ] ;
    }
    L.data[ i -1 ] = e;  // 在位置 i 处放入 e
    L.length++;           // 线性表的长度 加 1
    return true;
}

插入算法的平均时间复杂度为O(N)

最好情况:在表尾插入(即 i = n + 1 ),元素移动语句将不执行,时间复杂度为 O(1) 。

最坏情况:在表头插入(即 i = 1 ),元素移动语句将执行 n 次,时间复杂度为 O( n ) 。

(2)顺序表的删除操作代码

// 本算法实现删除顺序表 L 中第 i 个位置的元素
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
    return true;
}

最好情况:删除表尾元素(即 i = n),无须移动元素,时间复杂度为 O(1)。

最坏情况:删除表头元素(即 i = 1),需要移动一个元素外的所有元素,时间复杂度为 O(n) 。

同理删除操作的平均时间复杂度也是O(N)

(3)按值查找,返回位序。

//本算法实现查找顺序表中值为 e 的元素,如果查找成功,返回元素位序,否则返回 0
int  LocateElem( SqList  L  , ElemType e){
int i ;
for( i = 0 ; i < L.length ; i++){
     if( L.data[ i ] == e){
          return  i +1 ;     // 下标为 i 的元素值等于 e ,返回其位序 i + 1
     }
    return  0;               //退出循环,说明查找失败
}

最好情况:查找的元素就在表头,仅需比较一次,时间复杂度为 O(1) 。

最坏情况:查找的元素在表尾(或不存在)时,需要比较 n 次,时间复杂度为 O(n)。

因此,线性表按值查找算法的平均时间复杂度为 O(n) 。

(4)按下标查找、随机访问。

给定下标之后(或给定取第几个元素)可以直接通过下标访问l.data[i],l.data[i-1];因此随机访问的时间复杂度为O(1)。

下一篇文章介绍顺序表的链式表示

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32利用CubeMX实现外部中断触发数码管加减数

首先打开proteus绘制电路图&#xff0c;如下&#xff1a; 然后打开CubeMX&#xff0c;配置晶振和GPIO&#xff1a; 接下来就是生成keil工程文件&#xff0c;用keil打开。 新建一个desplay.h文件&#xff1a;下面是全部代码 #ifndef __DESPLAY_H #define __DESPLAY_H #endif#i…

python 3.11中安装sympy(符号工具包)

1.python环境&#xff1a; 2.安装遇到问题&#xff1a; … 3.升级pip cmd命令行中&#xff0c;执行如下命令&#xff1a; python.exe -m pip installl --upgrade pip 4.再次安装sympy cmd命令行中&#xff0c;执行如下命令&#xff1a; pip install sympy 5.简单应用 对…

手把手教你Jenkins整合Jmeter实现自动化接口测试!

01、在机器上安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改jmeter.properties 中 jmeter.save.saveservice.output_format值为xml。 编写接口测试脚本&#xff1a; 脚…

OpenGL ES (OpenGL) Compute Shader 计算着色器是怎么用的?

OpenGL ES (OpenGL) Compute Shader 是怎么用的? Compute Shader 是 OpenGL ES(以及 OpenGL )中的一种 Shader 程序类型,用于在GPU上执行通用计算任务。与传统的顶点着色器和片段着色器不同,Compute Shader 被设计用于在 GPU 上执行各种通用计算任务,而不是仅仅处理图形…

Apache DolphinScheduler 3.2.1 版本发布:增强功能与安全性的全面升级

近期&#xff0c;Apache DolphinScheduler 社区激动地宣布 3.2.1 版本的发布。此次更新不仅着力解决了前一版本&#xff08;3.2.0&#xff09;中遗留的问题&#xff0c;而且引入了一系列的功能增强和优化措施。 原先的问题主要源于部分重要代码在发布过程中未能成功合并&#x…

LabVIEW储氢材料循环寿命测试系统

LabVIEW储氢材料循环寿命测试系统 随着氢能技术的发展&#xff0c;固态储氢技术因其高密度和安全性成为研究热点。储氢材料的循环寿命是衡量其工程应用的关键。然而&#xff0c;传统的循环寿命测试设备存在成本高、测试效率低、数据处理复杂等问题。设计了一种基于LabVIEW软件…

深度学习系列59:文字识别

1. 简单文本&#xff1a; 使用google加的tesseract&#xff0c;效果不错。 首先安装tesseract&#xff0c;在mac直接brew install即可。 python调用代码&#xff1a; import pytesseract from PIL import Image img Image.open(1.png) pytesseract.image_to_string(img, lan…

Java的加密的字段模糊查询

Java的加密的字段模糊查询 1.对于加密字段查询不是很友好&#xff0c;但有这样的需求的&#xff0c;本文提供以下思路 2.如何对加密后的数据进行模糊查询 我整理了一下对加密的数据模糊查询大致分为三类做法&#xff0c;如下所示&#xff1a; 沙雕做法&#xff08;不动脑思考…

k8s(4)

目录 负载均衡部署 做初始化操作&#xff1a; 每台主机添加域名 从 master01 节点上拷贝证书文件、各master组件的配置文件和服务管理文件到 master02 节点: 修改02配置文件kube-apiserver&#xff0c;kube-controller-manager&#xff0c;kube-scheduler中的IP&#xff1…

魔改Mac OS渗透测试工具箱!

简介 本工具箱为v1版本&#xff0c;由"森然"师傅进行二开。 通过Python进行调用&#xff0c;并实现图形化界面。 参考&#xff1a;狐狸工具箱&#xff0c;闲客工具箱 环境以及工具 综合了常用的几个工具 适配Mac、Windos、Linux用户 注意&#xff1a;自带的jav…

软件运维维保服务方案-套用模板

软件运维维保方案-套用模板 项目情况 1.1 项目背景简述项目的来源、目的和重要性。说明项目的规模、预算和预期目标。 1.2 项目现状分析当前系统/软件的运行状态、存在的问题和潜在风险。提供最近一次的维护报告或相关统计数据。服务简述 2.1 服务内容明确运维服务的具体内容&…

网站开发--Cookie 和 Session 的工作流程

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–Cookie 和 Session 的工作流程 一.Cookie和Session的基本概念 前言:HTTP协议是无状态协议 无状态协议就是指HTTP协议在传输的过程中不会保存上一次交互的状态信息,但是…

Linux之用户跟用户组

目录 一、简介 1.1、用户 1.2用户组 1.3UID和GID 1.4用户账户分类 二、用户 2.1、创建用户&#xff1a;useradd 2.2、删除用户&#xff1a;userdel 2.3 、修改用户 usermod 2.4、用户口令的管理:passwd 2.5、切换用户 三、用户组 3.1、增加一个用户组:groupadd 3.…

Makefile静态库动态库的构建和链接之工程实用篇

静态库和动态库的构建和链接 现有C工程目录结构如下&#xff1a; add.h int add(int a, int b);add.cpp #include "add.h"int add(int a, int b) {return ab; }main.cpp #include <iostream> #include "add.h"int main() {std::cout << a…

数据结构-二分搜索树(Binary Search Tree)

一,简单了解二分搜索树 树结构: 问题:为什么要创造这种数据结构 1,树结构本身是一种天然的组织结构,就好像我们的文件夹一样,一层一层的. 2,树结构可以更高效的处理问题 二,二分搜索树的基础 1、二叉树 2,二叉树的重要特性 满二叉树 总结: 1. 叶子结点出现在二叉树的最…

Python习题详解

练习&#xff1a; 1&#xff0c;计算100以内奇数的和 #计算100以内所有奇数的和 sum 0 # n 1 # while n < 100: # # sum sum n # sum n # # n n 2 # n 2 # print(sum) n 99 #求偶数时n 100 while n > 0:sum n# n n - 2n - 2 print(sum)2&#xff0c;打印直…

【多线程】多线程案例——单例模式详解(包含懒汉模式,饿汉模式)

单例模式 &#x1f334;饿汉模式&#x1f38d;懒汉模式&#x1f338;单线程版&#xff08;线程不安全&#xff09;&#x1f338;多线程版&#x1f338;多线程版(改进) ⭕总结 单例模式是校招中最常考的 设计模式之⼀. 啥是设计模式? 设计模式好⽐象棋中的 “棋谱”. 红⽅当头…

AtCoder ABC342 A-D题解

华为出的比赛&#xff1f; 好像是全站首个题解哎&#xff01; 比赛链接:ABC342 Problem A: 稍微有点含金量的签到题。 #include <bits/stdc.h> using namespace std; int main(){string S;cin>>S;for(int i0;i<s.size();i){if(count(S.begin(),S.end(),S[i…

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测…

书生·浦语大模型实战营第六节课作业

基础作业 python run.py --datasets ceval_gen --hf-path /root/model/Shanghai_AI_Laboratory/internlm2-chat-7b/ --tokenizer-path /root/model/Shanghai_AI_Laboratory/internlm2-chat-7b/ --tokenizer-kwargs padding_sideleft truncationleft trust_remote_codeTrue --m…