第六章:数据结构与算法-part2:数据的存储结构

news2025/1/23 4:00:30

文章目录

  • 一、一般线性表存储
    • 1.1、线性表顺序存储
    • 1.2、线性表的链式存储
      • 1.2.1、 单链表
        • 1、单链表的存储
        • 2、单链表的基本操作的实现
      • 1.2.2、双向链表
  • 二、栈的存储结构
    • 2.1 顺序栈
      • 2.1.1、顺序栈的操作
        • 1、 初始化空栈
        • 2、插入
        • 3、删除操作pop
        • 4、获取栈顶元素
    • 2.2 链栈
  • 三、队列的存储
    • 3.1 链队列:队列的链式表示
      • 3.1.1 基本操作的算法描述
    • 3.2 顺序队列
  • 四、二叉树的存储结构
    • 4.1 顺序存储二叉树(数组表示)

目标:

  • 掌握典型的数据结构
  • 掌握软件开发中存储对象的定义方法
  • 掌握数据结构与算法基础应用
  • 掌握业务逻辑的算法设计与选择方法

一、一般线性表存储

物理结构,又称存储结构。数据的存储结构是逻辑结构在计算机存储器中的实现。数据元素在计算机中主要有两种不同的存储方法:顺序存储结构和链式存储结构。

  • 顺序存储结构: 借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系(公式化描述)
  • 链式存储结构: 借助指示元素存储地址的指针表示数据元素之间的逻辑关系(链式描述)
  • 不同的数据结构可以选择不同的物理结构存储

在这里插入图片描述
1、顺序存储
特点:内存地址连续,支持随机存取,适用于频繁查询;节约空间
在这里插入图片描述
2、链式存储
特点:线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素。
在这里插入图片描述

1.1、线性表顺序存储

线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素。
特点:是一种随机存取的存储结构只要确定了起始位置,就可以访问表中的任何一个元素

线性表顺序存储结构体定义:(一般用数组去描述)

#define LIST_INIT SIZE  100
#define LISTINCREAMENT  10
typedef struct {
	ElemType	*elem; /*指向线性表占用的数组空间。*/
	int	length;	/* 线性表的长度*/	
	int listsize;	/*当前分配的存储容量(以sizeof(ElemType)为单位*/
}SqList;

在这里插入图片描述
顺序线性表的操作

顺序表容易实现访问操作,可随机存取元素。但插入和删除操作主要是移动元素。
(1) 初始化操作:算法思想,构造一个空表。设置表的起始位置、表长及可用空间

Status InitList_Sq(SqList &L) {
	// 构造一个空的线性表
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE*size of (ElemType));
	if(! L.elem) exit(OVERFLOW) // 存储分配失败
	L.lenght = 0; // 空表长度0
	L.listsize = LIST_INIT_SIZE; // 初始存储容量
	return OK;
} // InitList_Sq

(2)线性表的顺序表插入操作 ListInsert(&L,i,e)

  • 分析:分析:“插入元素”使线性表的逻辑结构发生什么变化?假设在线性表的第i个元素之前插入一个元素e。
  • 插入元素时,线性表的逻辑结构
  • 基本思想:1、检查i值是否超出所允许的范围1<i<n+1,若超出,则进行“超出范围”错误处理。2、存储空间是否已满,如满需要增加空间;3、将线性表的第i个元素和它后面的所有元素均向后移动一个位置;4、将新元素写入到空出的第i个元素位置上。5、使线性表的升序增1
    在这里插入图片描述
    在这里插入图片描述
    (3)线性表的顺序表删除操作ListDelete(&La,i,&e)
  • 分析:“删除元素” 线性表的逻辑结构发生什么变化?假设删除线性表的第i个元素保存在变量e中。
  • 删除元素时,线性表的逻辑结构由
  • 基本思想:1、检查i值是否超出所允许的范围 (lsisn),若超出,则进行“超出范围”错误处理。2、将线性表的第i个元素给e; 3、将线性表的第i个元素后面的所有元素均向前移动一个位置。4、使线性表的长度减1。
    在这里插入图片描述
    在这里插入图片描述
    (4) 线性表的顺序表查找操作(时间复杂度:O(ListLength(L))
    在这里插入图片描述

顺序存储结构的优缺点:
优点:
逻辑相邻,物理相邻
可随机存取任一元素
存储空间使用紧凑
缺点:
插入、删除操作需要移动大量的元素
预先分配空间需按最大空间分配,利用不充分
表容量难以扩充

1.2、线性表的链式存储

线性表的链式表示与实现有3种形式:单链表、循环链表、双向链表

1.2.1、 单链表

(1)特点:

用一组任意的存储单元存储线性表的数据元素。利用指针实现了用不相邻的存储单元存放逻辑上相邻的元素。每个数据元素a;,除存储本身信息外,还需存储其直接后继的信息。结点:数据元素a;的存储映像。
数据域:元素本身信息
指针域: 指示直接后继的存储位置
在这里插入图片描述

1、单链表的存储

在这里插入图片描述
(3)单链表的实现
在这里插入图片描述
在这里插入图片描述

2、单链表的基本操作的实现

在这里插入图片描述
(1)、查找操作

算法基本思想:

  • 令p为指针变量,首先指向第一个结点,变量j为计数器;
  • 依次向后查找,循环结束的条件,p为空或者j=i。
  • 如果p为空并且j>i,出错
  • 否则找到了,用e返回第i个元素

算法实现
在这里插入图片描述
(2) 插入操作
在这里插入图片描述
(3)删除操作——ListDelete(&L,i,&e)

在这里插入图片描述
(4) 创建单链表(头插法)
在这里插入图片描述
(5)创建单链表(尾插入法)
在这里插入图片描述

1.2.2、双向链表

在这里插入图片描述
定义:
在这里插入图片描述

二、栈的存储结构

在这里插入图片描述
在这里插入图片描述

2.1 顺序栈

用顺序存储结构表示的栈。顺序栈用一组连续的存储单元存放自栈底到栈顶的数据元素,一般用一维数组表示,设置一个简单变量top指示栈顶位置,称为栈顶指针,它始终指向待插入元素的位置
理解栈的运算特点:后进先出 或 先进后出
栈的顺序存储结构是用一组连续的存储单元依次存放栈中的每个数据元素,并用起始端作为栈底

2.1.1、顺序栈的操作

1、 初始化空栈

构建空栈,分配空间
在这里插入图片描述

2、插入

操作示意图:
在这里插入图片描述
代码实现(C):
在这里插入图片描述

3、删除操作pop

在这里插入图片描述

4、获取栈顶元素

在这里插入图片描述

2.2 链栈

在这里插入图片描述
链栈的示意图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、队列的存储

队列逻辑结构:队列是插入在一端进行而删除在其另一端进行的线 性表。并按**先进先出(FIFO)**的原则进行操作。

  • 能进行删除的一端称为队头(front)
  • 能进行插入操作的一端称为队尾(rear)
    在这里插入图片描述

3.1 链队列:队列的链式表示

  • 链队列中,有两个分别指示队头和队尾的指针
  • 链式队列在进队时无队满问题,但有队空问题
    在这里插入图片描述
    在这里插入图片描述
    结构体定义:
    在这里插入图片描述

3.1.1 基本操作的算法描述

1、初始化
在这里插入图片描述

2、销毁队列

free函数:释放

在这里插入图片描述
3、入队
在这里插入图片描述
4、出队
在这里插入图片描述

3.2 顺序队列

在这里插入图片描述
顺序队列操作时指针的变化情况:
在这里插入图片描述
如何解决(d)中的队列“假满”状态? 将顺序队列改造为循环队列
在这里插入图片描述

四、二叉树的存储结构

4.1 顺序存储二叉树(数组表示)

顺序存储二叉树的具体方法是:在一棵具有n个结点的完全二叉树中,从根结点开始编号为1,自上到下,每层自左至右地给所有结点编号,这样可以得到一个反映整个二叉树结构的线性序列;然后将完全二叉树上编号为i的结点依次存储在一维数组中下标为i-1的元素中。
实现:按满二叉树中结点的编号,依次存放二叉树中的数据元素。
特点:结点间关系蕴含在其存储位置中
在这里插入图片描述

在这里插入图片描述
1、顺序存储结构
在这里插入图片描述
2、链式存储结构

链式存储是使用链表来存储二叉树中的数据元素链表中的一个结点相应地存储二叉树中的一个结点。
常见的二叉树的链式存储结构有两种:叉链表和三叉链表
二叉链表:是指链表中的每个结点包含两个指针域和一个数据域,分别用来存储指向二叉树中结点的左右孩子的指针及结点信息。
三叉链表是指链表中的每个结点包含三个指针域和一个数据域,相比二叉链表多出的一个指针域则用来指向该结点的双亲结点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

精进面试技巧:如何在程序员面试中脱颖而出

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Docker harbor 私有仓库的部署和管理

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 四、部署配置Docker Harbor 1. 首先需要安装 Docker-Compose 服务 2.部署 Harbor 服务 3.使用harbor仓库 &#xff08;1&#xff09;项目管理 &#xff08;2&#xff09;用户管理 一、什么是Harbor Harbor …

面试前的准备:程序员应该如何备战面试

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

JavaScript 开发的asp网页获取RFID读卡器以http协议Request提交的访问文件,Response回应驱动设备显示文字

本示例使用的设备&#xff1a; 液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) <%LANGUAGE"JavaScript" CODEPAGE"65001"%><% //格式化显示系统日期时钟 function formatDate(time){var date new Date(time…

HAproxy(四十七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 简介 1.2 核心功能 1.3 关键特性 1.4 应用场景 二、安装 1.内核配置 2.编译安装 ​3. 建立配置文件 4. 添加为系统服务 5. 添加3和5运行级别下自启动…

数据恢复软件EasyRecovery16最新版本下载安装激活教程

EasyRecovery16作为一款专业的数据电脑恢复软件&#xff0c;除了有着优秀的数据恢复能力外&#xff0c;还有许多便捷的操作技巧。即便是对于计算机很是白目的使用者来说&#xff0c;Ontack EasyRecovery也是值得入手的&#xff0c;使用者不必大费周章去备份重要的文件&#xff…

通达信股票接口怎么设计委托撤单模块?(通达信接口开发)

在股市里运用到的设计委托撤单模块的主要目标是实现通过通达信股票接口提交委托和撤单操作。以下是设计委托撤单模块的一般步骤&#xff1a; 1. 连接通达信接口&#xff1a;首先需要使用通达信股票接口连接到通达信系统软件&#xff0c;以便能够与交易系统进行通信。这通常涉及…

SpringBoot项目(jar)部署,启动脚本

需求 SpringBoot项目&#xff08;jar&#xff09;部署&#xff0c;需要先关闭原来启动的项目&#xff0c;再启动新的项目。直接输入命令&#xff0c;费时费力&#xff0c;还容易出错。所以&#xff0c;使用脚本启动。 脚本 脚本名&#xff1a;start.sh 此脚本需要放置在jar包…

三维模型OBJ格式轻量化压缩并行计算处理方法浅析

三维模型OBJ格式轻量化压缩并行计算处理方法浅析 三维模型的轻量化是指通过一系列技术和算法来减小三维模型的文件大小&#xff0c;以提高模型在计算机中的加载、渲染和传输效率。并行计算是利用多个计算单元同时执行任务&#xff0c;以加速计算过程的一种技术。在三维模型的O…

Dubbo指标埋点

1. 指标接入说明 2. 指标体系设计 Dubbo的指标体系&#xff0c;总共涉及三块&#xff0c;指标收集、本地聚合、指标推送 指标收集&#xff1a;将Dubbo内部需要监控的指标推送至统一的Collector中进行存储本地聚合&#xff1a;指标收集获取的均为基础指标&#xff0c;而一些分…

OpenAI推出ChatGPT企业版,提供更高安全和隐私保障

&#x1f989; AI新闻 &#x1f680; OpenAI推出ChatGPT企业版&#xff0c;提供更高安全和隐私保障 摘要&#xff1a;OpenAI发布了面向企业用户的ChatGPT企业版&#xff0c;用户可以无限制地访问强大的GPT-4模型&#xff0c;进行更深入的数据分析&#xff0c;并且拥有完全控制…

2023.8.24 关于 Selenium 的简单示例

目录 Selenium 是什么 Selenium 特点 Selenium 工作原理 流程图 使用 Selenium 实现一个简单自动化测试用例 Selenium 是什么 Selenium 是用来测试 Web 应用程序的功能和用户界面的 开源自动化测试工具 Selenium 特点 支持各种浏览器&#xff08;Chrome、Firefox、Safari&…

白皮书发布丨《多渠道协同,银行业数字化营销实践新范式》

数字化时代&#xff0c;银行业步入存量竞争阶段&#xff0c;各家银行在寻找新的市场增长点的同时&#xff0c;更重视现有客户的管理和挖掘&#xff0c;实现客户价值最大化。多渠道协同客群经营已经成为存量时代银行发展的核心竞争力。 神策数据今日发布《多渠道协同&#xff0c…

什么是伪类链(Pseudo-class Chaining)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Pseudo-class Chaining⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚…

Docker consul容器服务自动发现和更新

目录 一、什么是服务注册与发现 二、Docker-consul集群 1.Docker-consul 2.registrator 3.Consul-template 三、Docker-consul实现过程 四、Docker-consul集群配置 1.下载consul服务 2.web服务器启动多例nginx容器&#xff0c;使用registrator自动发现 3.使用…

CVE-2023-21839 Weblogic未授权RCE

https://github.com/4ra1n/CVE-2023-21839下载之后 生成CVE-2023-21389.exe 先试试dnslog&#xff1a; CVE-2023-21839.exe -ip 116.xx.xx.xx -port 7001 -ldap ldap://whoami.eduvck.dnslog.cn/aa然后使用JNDIExploit-1.4-SNAPSHOT.jar进行攻击 另一个终端上 首先开启监听 …

【c语言】结构体内存对齐,位段,枚举,联合

之前学完结构体&#xff0c;有没有对结构体的大小会很疑惑呢&#xff1f;&#xff1f;其实结构体在内存中存储时会存在内存对齐&#xff0c;捎带讲讲位段&#xff0c;枚举&#xff0c;和联合&#xff0c;跟着小张一起学习吧 结构体内存对齐 结构体的对齐规则: 第一个成员在与结…

2023.8.25 关于 Selenium 常用 API 详解

目录 引言 打开页面 查找页面元素 输入文本 点击操作 提交操作 清除文本 获取文本和属性值 ​编辑 选择多个元素 获取页面标题和URL 等待操作 浏览器操作 多层框架定位 窗口操作 屏幕截图 下拉框元素选择操作 ​编辑 执行脚本 文件上传 引言 本文讲的所有…

汇编-内中断

中断的意思是指&#xff0c; CPU不再接着(刚执行完的指令) 向下执行&#xff0c; 而是转去处理这个特殊信息。 8086CPU&#xff0c;当CPU内部有下面的情况发生的时候&#xff0c; 将产生相应的中断信息&#xff1a; (1)除法错误&#xff0c; 比如&#xff0c; 执行div指令产生…

springboot中使用ElasticSearch

引入依赖 修改我们的pom.xml&#xff0c;加入spring-boot-starter-data-elasticsearch <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>编写配…