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

【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式

不同类型的链表

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 不同类型的链表
  • 概述
  • 1. 数据类型识别
    • 1.1 TLV格式介绍
    • 1.2 结构体分层定义
    • 1.3 定义抽象数据类型
  • 2. 链表定义
    • 2.1 数据节点定义
    • 2.2 链表类型定义
  • 节点解析
  • 链表遍历
  • 多级树链表
  • 总结
  • 结尾

概述


在实际使用中,会存在不同的数据类型,有基本类型,有自定义的结构体的复杂类型。

当这么丰富的数据出现时,只能记录到动态扩展的链表中,同时还能够查找,并按正确的类型取出。

本节就来介绍,在同一个链表中如何记录如此丰富的数据资源,分别从

  • 数据类型识别;
  • 链表的定义;
  • 节点解析;
  • 链表遍历
    四个方面来展开介绍。

1. 数据类型识别


要识别出不同的数据类型,这里介绍一种数据结构的定义格式TLV。

1.1 TLV格式介绍

TLV(tag-length-value)是一种用于以结构化方式表示数据的二进制格式。TLV在计算机网络协议、智能卡应用以及其他数据交换场景中经常被使用。TLV由以下三部分组成:

  1. 标签(Tag):唯一标识数据的类型。它通常是一个单字节或一小段字节序列, 可以是不同bit代表不同含义,也可以是整体表示序列。

  2. 长度(Length):数据字段的字节长度。在某些协议中,标签和长度字段的长度也会被包含在内。

  3. 值(Value):实际传输的数据,可以是任何类型或格式。

在这里插入图片描述

这种格式通过明确区分数据的类型、长度和具体内容,使得数据的解析和处理变得更加清晰和高效。

1.2 结构体分层定义

  • 首先定义复合类型,一般使用枚举类型进行定义。

在手写数据库toadb的src/sqlcore/node/nodeType.h文件中就有用到这种定义。

这里举例定义如下:

typedef enum NodeType
{T_START,/* parser nodes */T_List,T_MANAGER,T_HR,T_EMPLOYEE
}NodeType;
  • 然后在各复合类型的结构定中,前两个字段采用公共字段。

这里定义经理,HR,员工三个结构体类型,每个人都有一个sno员工号的数据,他们的个性化数据有:

  • 经理,有管理多少个员工;
  • HR,新入职了多少新员工;
  • 员工,对应的部门经理的工号;
typedef struct stManager
{NodeType type;int size;int sno;int employeeNum;
}stManager;typedef struct stHr
{NodeType type;int size;int sno;int newEmployeesNum;
}stHr;typedef struct stEmployee
{NodeType type;int size;int sno;int partMgr;
}stEmployee;

1.3 定义抽象数据类型

自定义的数据结构太多了,为了在使用中统一和简化,这里定义Node数据类型,是对上述数据类型的统称。

/* common type, real size is just by type. */
typedef struct Node
{NodeType type;int size;
}Node;

Node数据结构中包含两个公共的字段,类型和大小。

这样在参数引用,链表节点引用时,都可以用这个抽象的类型来代表以上众多的数据类型。

当然,有这个抽象结构定义之后,ListCell中的数据指针类型可以用Node类型代替,而不是之前定义的void。

2. 链表定义


既然是链表,肯定采用指针的方式串连起来,以往都是定义一种明确的数据类型作为链表的节点。

而面对如此多的数据类型,链表节点的结构如何定义呢?

2.1 数据节点定义

数据节点中存储真实的数据,由链表指针将数据节点串连起来。

它的定义如下:

/* tree list cell */
typedef struct ListCell
{void* pValue;struct ListCell *next;
}ListCell;
  • 数据类型不确定,所以定义为void *;
  • 单链表的形式,next指向下一个节点;

2.2 链表类型定义

部门的结构是一个多层级形式,每个层级又是多个员工,也是一个链表。

因此,数据类型中,除了实际意义的数据类型,如上面定义的经理,HR,员工外,还需要增加链表的数据类型。

/* tree list node */
typedef struct List
{NodeType type;int size;int length;         /* number of ListCell struct */ListCell *head;
}List;

链表的数据类型中,数据有两个:

  • length, 链表中的节点个数;
  • head,链表头;

节点解析


数据的多样性,增加了链表节点类型解析工作,因为之前采用了统一类型定义,所以类型的解析变得简单。

采用统一的接口对类型进行解析, 分发到对应的类型进行处理。

static void ShowNode(Node *n)
{if(NULL == n){return;}switch(n->type){case T_List:ShowNodList(n);break;case T_MANAGER:ShowNodManager(n);break;case T_HR:ShowNodHR(n);break;case T_EMPLOYEE:ShowNodEmployee(n);break;default:break;}
}

这里定义了一个展示各节点信息的接口,根据节点类型再调用各自的接口进行展示。

链表遍历


经过上面的抽象类型之后,链表的遍历就非常简单,这里以链表的节点的显示为例。

void TravelListCell(List *list)
{ListCell *tmpCell = NULL;List *l = list;if(NULL == l){return;}/* list cell node show */for(tmpCell = l->head; tmpCell != NULL; tmpCell = tmpCell->next){Node *node = (Node *)(tmpCell->pValue);ShowNode(node);}return;
}

说明:

  • 传入的是一个List的指针,这里会包含一个链表;
  • 从成员head开始遍历,直到链表节点的next为空,也就是链尾;
  • 将链表节点的数据成员转为抽象类型Node *, 传入统一的处理接口;

多级树链表


将经理的数据成员增加一项,除了下属成员数量外,还列出下属的员工信息;

typedef struct stManager
{NodeType type;int size;int sno;int employeeNum;Node *employeeList;
}stManager;

这里有个特别的地方,对于T_List类型的数据,内部会递归调用TravelListCell,这样就是一个多级链表树。

在这里插入图片描述

如同一个公司的组织架构一样,顶层由HR,高级经理列表组成,每个高级经理下属由员工,中级经理组成;

而中级经理下属由多名员工组成,整体组成一个公司的树形组织架构图。

对于T_LIst类型的节点,它的显示处理函数如下:

void ShowNodList(Node *n)
{if(NULL == n)return ;TravelListCell((List *) n);
}

其实是深度优先的图递归遍历,其它数据节点的显示就相对简单,打印成员信息即可,这里不再列举。

总结


本文介绍了链表节点为不同数据类型时的处理方法,定义了抽象类型后使引用的类型统一,同时在遍历树形链表时,对于成员仍为链表时,采用深度优先的递归遍历。

这种链表在数据库内核中应用比较广泛,比如在SQL语法解析时,将语法的各子句解析成不同的数据类型,而像select子句,可以写多个列名,该子句内部又以链表形成存储列信息。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

相关文章:

【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式

不同类型的链表 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 不同类型…...

Pandas 进阶 —— 数据转换、聚合与可视化

引言 在数据分析的旅程中,Pandas 库提供了从数据转换到聚合再到可视化的全面解决方案。上篇我们掌握了数据的导入和清洗,本篇我们将探索如何通过 Pandas 对数据进行更高级的处理,包括数据转换、聚合分析以及可视化展示。 数据转换 数据转换…...

华为OD机试 - 来自异国的客人(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…...

期末上分站——计组(3)

复习题21-42 21、指令周期是指__C_。 A. CPU从主存取出一条指令的时间 B. CPU执行一条指令的时间 C. CPU从主存取出一条指令的时间加上执行这条指令的时间。 D. 时钟周期时间 22、微型机系统中外设通过适配器与主板的系统总线相连接,其功能是__D_。 A. 数据缓冲和…...

IDA*——AcWing 180. 排书

IDA* 定义 IDA*(Iterative Deepening A*)是一种结合了深度优先搜索(DFS)的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题,尤其是当搜索空间很大或者搜索成本不确定时。 IDA* 是…...

【云计算】公有云、私有云、混合云、社区云、多云

公有云、私有云、混合云、社区云、多云 1.云计算的形态1.1 公有云1.2 私有云1.3 混合云1.4 社区云1.5 多云1.5.1 多云和混合云之间的关系1.5.2 多云的用途1.5.3 影子 IT 和多云1.5.4 优缺点 2.不同云形态的对比 1.云计算的形态 张三⾃⼰在家做饭吃,这是 私有云&…...

MySQL中的MVCC解析

MySQL中的MVCC解析 多版本并发控制是MySQL中实现高并发的一种关键技术。通过对数据进行多版本的管理,MVCC能够在保证数据一致性的同时,提高数据库的并发性能。本文将深入探讨MySQL中的MVCC机制,包括其原理、实现方式以及优势。 MVCC的原理 …...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日聚会(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…...

初识STM32:芯片基本信息

STM32简介 STM32是ST公司基于ARM公司的Cortex-M内核开发的32位微控制器。 ARM公司是全球领先的半导体知识产权(IP)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构。 ST公司于1987年由意大利的SGS微电子与法国的Thomson半导体合并…...

Zabbix 配置PING监控

Zabbix PING监控介绍 如果需要判断机房的网络或者主机是否正常,这就需要使用zabbix ping,Zabbix使用外部命令fping处理ICMP ping的请求,在基于ubuntu APT方式安装zabbix后默认已存在fping程序。另外zabinx_server配置文件参数FpingLocation默…...

异常解决(三)-- Wandb fails with ServiceStartProcessError

原文链接:https://github.com/wandb/wandb/issues/5765 我的环境配置: Python3.8.16 Wandb0.17.4 在使用Wandb记录实验数据时, 报以下错误: ServiceStartProcessError: The wandb service process exited with 1. Ensure that s…...

Qt调用Matlab(一)

目录 1 概述2 创建Qt工程2.1 增加Matlab支持3 调用Matlab3.1 widget.h3.2 widget.cpp4 运行4.1 配置4.2 运行1 概述 MATLAB是MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域…...

网络爬虫(二) 哔哩哔哩热榜高频词按照图片形状排列

我们有时候需要爬取结果生成为自定义的词云图 生成自定义的词云图通常需要以下步骤: 1. 爬取数据:使用爬虫工具或库,如requests、BeautifulSoup等,可以爬取网页、论坛、社交媒体等平台上的文本数据。 2. 数据预处理&#xff1a…...

MySQL 常见错误及解决方案

1. Too many connections 运行环境:Winows11、Phpstudy V8.1.1.3、MySQL 5.7.26 同一时间 MySQL 的连接数量有限制,当超过上限时将提示下面错误信息: 1040 - Too many connections 查看当前最大连接数 mysql> show variables like %max_…...

STM32 - 内存分区与OTA

最近搞MCU,发现它与SOC之间存在诸多差异,不能沿用SOC上一些技术理论。本文以STM L4为例,总结了一些STM32 小白入门指南。 标题MCU没有DDR? 是的。MCU并没有DDR,而是让代码存储在nor flash上,临时变量和栈…...

RAG理论:ES混合搜索BM25+kNN(cosine)以及归一化

接前一篇:RAG实践:ES混合搜索BM25+kNN(cosine) https://blog.csdn.net/Xin_101/article/details/140230948 本文主要讲解混合搜索相关理论以及计算推导过程, 包括BM25、kNN以及ES中使用混合搜索分数计算过程。 详细讲解: (1)ES中如何通过BM25计算关键词搜索分数; (2)…...

分享大厂对于缓存操作的封装

hello,伙伴们好久不见,我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙,基本是993了。 缓存大家再熟悉不过了,几乎是现在任何系统的标配,并引申出来很多的问题:缓存穿透、缓存击穿、缓存雪崩…...

冯诺依曼体系结构与操作系统(Linux)

文章目录 前言冯诺依曼体系结构(硬件)操作系统(软件)总结 前言 冯诺依曼体系结构(硬件) 上图就是冯诺依曼体系结构图,主要包括输入设备,输出设备,存储器,运算…...

开源六轴协作机械臂myCobot280实现交互式乘法!让学习充满乐趣

本文经作者Fumitaka Kimizuka 授权我们翻译和转载。 原文链接:myCobotに「頷き」「首振り」「首傾げ」をしてもらう 🤖 - みかづきブログ・カスタム 引言 Fumitaka Kimizuka 创造了一个乘法表系统,帮助他的女儿享受学习乘法表的乐趣。她可以…...

[C++][CMake][嵌套的CMake]详细讲解

目录 0.前言 & 准备1.节点关系2.添加子目录3.解决问题1.根目录2.calc目录3.sort目录4.calc_test目录5.sort_test 4.注意 0.前言 & 准备 如果项目很大,或者项目中有很多的源码目录,在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Bean 作用域有哪些?如何答出技术深度?

导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答&#xff0c…...

离线语音识别方案分析

随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...