当前位置: 首页 > 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;提供了多种方式来创建平滑且吸引人的动画效果。本文将详…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...