当前位置: 首页 > news >正文

顺序表的实现——数据结构

线性表

文章目录

  • 线性表
    • 线性表的定义和基本操作
      • 线性表的定义
      • 线性表的基本操作
    • 线性表的顺序表示
      • 顺序表的定义
      • 顺序表的实现——静态分配
      • 顺序表的实现——动态分配
      • 顺序表的特点

线性表的定义和基本操作

线性表的定义

线性表(Linear List)的定义

​ 线性表是一个具有相同数据类型的n(n≥0) 个数据元素的有限序列,其中n为表长,当 n = 0 时,线性表是一个空表 。若用 L 命名线性表,则一般表示为:

​ L = ( a1, a2, a3, a4,…,an)

​ 几个概念:

  • ai是线性表中的“第i个”元素线性表中的次序
  • a1表头元素 ,an表尾元素
  • 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继

线性表的基本操作

线性表的基本操作

​ 一个数据结构最基本的操作是指其最核心、最基本的操作。其他较复杂的操作可以通过调用其基本操作来实现。线性表的基本操作如下:

  • InitList(&L) 初始化表,构造一个空的线性表L,并分配内存空间。
  • Destroy(&L) 销毁操作。销毁线性表,并释放线性表L所占用内存空间。
  • Listlnsert(&L,i,e) 插入操作。在表L中第i个位置上插入指定元素e。
  • ListDelete(&L,i,&e) 删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
  • LocateElem(L,e) 按值查找操作。在表L中查找具有给定关键字值的元素。
  • GetElem(L,i) 按位查找操作。获取表L中第i个位置的元素的值。

其他操作:

  • Length(L) 求表长。返回线性表 L的长度,即L中数据元素的个数。
  • PrintLIst(L) 输出操作。按前后顺序输出线性表L的所有元素值。
  • Empty(L) 判空操作。若L为空表,则返回true 否则返回false

Tips

  • 对数据的操作——创销、增删改查
  • C语言函数的定义—— <返回值类型> 函数名 (<参数类型> 参数 …)
  • 实际开发中,可以根据实际需求定义其他的基本操作
  • 函数名和参数形式、命名都可以更改 (但命名需要有可读性)
  • 什么时候要传入引用“&” ——对参数的修改结果需要“带回来“(cpp)

对数据结构基本操作的作用

  • 团队合作编程,定义的数据结构可以能够方便的使用(封装)。
  • 将常用操作/运算封装成函数,避免重复工作,降低出错风险。

在这里插入图片描述

线性表的顺序表示

顺序表的定义

顺序表 —— 用顺序存储的方式实现线性表

顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

顺序表的实现——静态分配

#define MaxSize 10				//定义最大长度
typedef struct{					ElemType data[MaxSize];		//用静态的“数组”存放数据元素int length;					//顺序表的当前长度
}SqList;						//顺序表的类型定义(静态分配方式)
#include<stdio.h>
#define MaxSize 10	//定义最大长度
typedf struct{int data[MaxSize];	//用静态的数组存放数据元素int length;			//顺序表的当前长度
}SqList;				//顺序表的类型定义void InitList(SqList &L){for (int i = 0; i < MaxSize; ++i) {L.data[i] = 0;  //将所有数据元素设置为默认初始值L.length = 0;	//顺序表初始长度为0}
}int main(){SqList  L;      //声明一个顺序表InitList(L);    //初始化顺序表return 0;
}

是否可以不设置默认初始值?

将设置默认初始值语句删除,并打印整个数组

#define MaxSize 10
#include<stdio.h>
typedef struct{int data[MaxSize];int length;
}SqList;
void InitList(SqList &L){L.length = 0;   //顺序表初始长度为0
}
int main(){SqList L;InitList(L);for (int i = 0; i < MaxSize; ++i) {printf("%d\n",L.data[i]);	//尝试“违规”打印整个数组//正常来讲,遍历需要i<L.length}
} 
-1539310592
212
-497739960
32758
-427333024
674
0
1
-497741824
32758

如果“数组“存满了怎么办?

顺序表的长度刚开始确定后就无法更改,即存储空间是静态的

若刚开始便声明很大的数组长度,则会造成内存的浪费

顺序表的实现——动态分配

Key: 动态申请和释放内存空间

C语言中,
使用malloc、free函数可以实现动态申请和释放内存空间
Cpp中,
使用new、delete关键字
#define InitSize 10 //顺序表的初始长度
typedf struct{ElemType *data;	//指示动态分配数组的指针int MaxSize;	//顺序表的最大容量int length;		//顺序表的当前长度
}SeqList;			//顺序表的类型定义(动态分配方式)

顺序表的实现——动态分配

//顺序表的实现——动态分配
#define InitSize 10 //默认的最大长度
#include<stdio.h>
#include<stdlib.h>
typedef struct{int *data;  //指示动态分配数组的指针int MaxSize;    //顺序表的最大容量int length;     //顺序表的当前长度
}SeqList;void InitList(SeqList &L){//使用malloc函数申请一片连续的存储空间L.data = (int *)malloc(InitSize *Sizeof(int));L.length = 0;L.MaxSize = InitSize;
}//增加动态数组的长度
void IncreaseSize(SeqList &L,int len){int *p = L.data;L.data = (int *)malloc((L.MaxSize+len)*(sizeof(int)));for (int i = 0; i < L.length; ++i) {L.data[i] = p[i];   //将数据复制到新区域——时间开销大}L.MaxSize = L.MaxSize + len;    //将顺序表最大长度增加到lenfree(p);						//释放原来的内存空间
}int main(){SeqList L;  //声明一个顺序表InitList(L);IncreaseSize(L,5);return 0;	
}

顺序表的特点

  • 随机访问 。即可以在O(1)时间内找到第i个元素
  • 存储密度不高。每个节点只存储数据元素
  • 拓展容量不方便。(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)

在这里插入图片描述

相关文章:

顺序表的实现——数据结构

线性表 文章目录 线性表线性表的定义和基本操作线性表的定义线性表的基本操作 线性表的顺序表示顺序表的定义顺序表的实现——静态分配顺序表的实现——动态分配顺序表的特点 线性表的定义和基本操作 线性表的定义 线性表&#xff08;Linear List&#xff09;的定义 ​ 线性…...

【模块化】CommonJS,AMD规范,CMD规范,ES6模块化

1. CommonJS Node.js基于CommonJS规范应运而生 1.1 commonjs规范语法导出模块 module.exports { a, b }1.2 commonjs规范语法引入模块 const mod require(./导出模块name)2. AMD 规范 RequireJS 是AMD规范的实现。是js文件和模块的加载器。 在没有单页应用&#xff08;angu…...

3.js - 顶点着色器、片元着色器的联系

1、定义与功能 顶点着色器 顶点着色器&#xff0c;是图形渲染管线中的第一个可编程阶段&#xff0c;它的主要任务是&#xff0c;处理从CPU发送到GPU的顶点数据&#xff0c;包括&#xff1a;1、顶点位置的变换&#xff08;如&#xff1a;模型空间 -> 世界空间 -> 视图控件…...

kotlin简介

Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言&#xff0c;被称之为 Android 世界的Swift&#xff0c;由 JetBrains 设计开发并开源。 Kotlin 可以编译成Java字节码&#xff0c;也可以编译成 JavaScript&#xff0c;方便在没有 JVM 的设备上运行。 在Google I/O 2017…...

Mintegral出海系列:解锁全球应用商店新增长路径

在全球化竞争的浪潮中&#xff0c;面对打法各异的应用和游戏品类&#xff0c;以及全球数百个环境不同的国家和地区&#xff0c;开发者们正面临着前所未有的挑战。Mintegral「出海ing」系列专题内容&#xff0c;助力出海开发者选准赛道探索新的增长路径。 据近期数据显示&#x…...

Qt 哈希加密之 QCryptographicHash

【写在前面】 QCryptographicHash 是 Qt 框架中提供的一个类&#xff0c;它用于实现加密散列函数&#xff0c;也就是我们常说的哈希函数。哈希函数能够将任意长度的数据转换为固定长度的哈希值&#xff0c;这个哈希值通常用于数据的完整性校验、密码存储等场景。 什么是哈希函数…...

渗透第二次作业

目录 简述rce漏洞 可能产生rce漏洞的函数 RCE代码执行漏洞示例 贷齐乐系统多处SQL注入漏洞 ​编辑 爆出库名 爆出表名 爆出表下的列名 查flag数据 简述rce漏洞 ​ rce漏洞&#xff0c;即远程代码执行和远程命令执行漏洞。这种漏洞允许攻击者在后台服务器上远程注入操作…...

42.【C语言】冒泡排序

目录&#xff1a; 冒泡排序 *核心思想 *分析 *代码 *优化 15.冒泡排序(bubble sort) *核心思想&#xff1a;两两相邻的元素进行比较&#xff0c;满足条件则两者交换 *分析 现要求升序排序 输入: 9 8 7 6 5 4 3 2 1 0 输出&#xff1a;0 1 2 3 4 5 6 7 8 9 下面展示一趟冒泡排…...

Linux安全与高级应用(七)深入Linux Shell脚本编程:循环与分支结构的高级应用

文章目录 深入Linux Shell脚本编程&#xff1a;循环与分支结构的高级应用一、循环结构详解1. for循环1.1 应用示例&#xff1a;检查主机状态 2. while循环2.1 应用示例&#xff1a;猜价格游戏 二、分支结构详解1. if语句1.1 单分支结构1.2 双分支结构1.3 多分支结构 2. case语句…...

python爬虫滑块验证及各种加密函数(基于ddddocr进行的一层封装)

git链接: https://github.com/JOUUUSKA/spider_toolsbox 这里写目录标题 一.识别验证码1、识别英文&#xff0b;数字验证码2、识别滑块验证码3、识别点选验证码 一.识别验证码 git链接: https://github.com/JOUUUSKA/spider_toolsbox 创作不易记得stars 1、识别英文&#xf…...

pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)

文章目录 前言一、miniconda和anaconda的关系1、Anaconda2、Miniconda3、总结 二、下载miniconda&#xff08;清华镜像链接&#xff09;三、安装miniconda1、安装2、或许要手动加载 ~/.bashrc 四、配置 命令1、查看anaconda安装博文2、取消默认进入conda&#xff08;base&#…...

说一下Android中的IdleHandler

IdleHandler 是 Android 中的一个接口&#xff0c;常用于在主线程空闲时执行一些低优先级的任务。 作用&#xff1a; 它提供了一种在主线程空闲时执行额外操作的机制&#xff0c;能够优化应用的性能和资源利用。 工作原理&#xff1a; 当主线程没有其他任务需要处理&#xff…...

Flake8 和 Autopep8 使用指南

Flake8 和 Autopep8 集成到 CI/CD 流程中&#xff0c;确保在代码提交和合并时自动进行检查和格式化&#xff0c;如果Autopep8格式化检查无法通过Flake8校验&#xff0c;说明pycodestyle版本依赖不兼容&#xff0c;参考文章&#xff1a;Flake8 与 Autopep8 兼容性指南 Flake8 使…...

OpenHarmony(数据)通信协议、数据存储—protobuf

介绍 ProtoBuf(protocol buffers) 是一种语言无关、平台无关、可扩展的序列化结构数据的方法&#xff0c;它可用于&#xff08;数据&#xff09;通信协议、数据存储等。,是一种灵活&#xff0c;高效&#xff0c;自动化机制的结构数据序列化方法比XML更小,更快,更为简单。 本项…...

vue3 依赖注入 vueRouter vuex

目录 01 依赖注入 02 组合式API里面的vueRouter 03 组合式API中的vuex的使用 01 依赖注入 使用场景&#xff1a; 有一个父组件&#xff0c;里头有子组件&#xff0c;有孙组件&#xff0c;有很多后代组件&#xff0c;共享父组件数据。 1.组先组件给后代组件传参 组先组件: 从…...

在Windows上用Visual Studio编译OpenCV

在Windows上编译开源项目&#xff0c;有时候让人痛不欲生&#xff0c;有时候却出奇地顺利。OpenCV属于后者。本文记录这次愉快的过程。 注&#xff1a;OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了大…...

详解2024年最值得推荐的5款CRM软件:如何选择适合企业需求的CRM系统?

在文章开始之前&#xff0c;我们前来了解下&#xff1a;什么是CRM系统&#xff1f; CRM系统&#xff0c;即客户关系管理系统&#xff0c;顾名思义&#xff0c;它是企业用来管理和维护与客户之间关系的重要工具。通过CRM系统&#xff0c;企业能够全面了解客户需求&#xff0c;优…...

2024靠谱的网站建设公司推荐

在现在的互联网社会&#xff0c;一个企业的网站往往是潜在客户对该品牌的第一印象来源。也正因如此&#xff0c;选择一个靠谱的网站建设公司对于确保企业在线形象和功能性至关重要&#xff0c;作为建站行业从业人员&#xff0c;我分享几个选择网站建设公司时应考虑的几个关键因…...

第一天:Java基础与环境搭建

第一天&#xff1a;Java基础与环境搭建 1. 理解Java基本概念 了解Java语言的历史&#xff1a;Java是一种广泛使用的编程语言&#xff0c;由Sun Microsystems&#xff08;现被Oracle收购&#xff09;于1995年首次发布。认识Java的特性&#xff1a;包括面向对象、平台无关性&am…...

动画魔法秀:JavaScript前端动画实战指南

标题&#xff1a;动画魔法秀&#xff1a;JavaScript前端动画实战指南 在现代Web开发中&#xff0c;动画不仅能够提升用户体验&#xff0c;还能使网页更加生动有趣。JavaScript作为实现前端动画的重要工具之一&#xff0c;提供了多种方式来创建平滑且吸引人的动画效果。本文将详…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...