自学嵌入式 day 23 - 数据结构 树状结构 哈希表
一、树状结构
1.特征:在任意一个非空树中,
(1),有且仅有一个特定的根结点
(2),当n>1 时,其余结点可分为m个互不相交的有限集合T1,T2,T3.。。。。Tm,其中每一个集合又是一个树,并且称为子树。
2.度:结点拥有子树的个数称谓结点的度。度为0的结点称谓叶结点。度不为0,称谓分支结点。
(1)树的度数:这棵树中,最大的结点的度数,称谓树的度数
3.树的深度和高度:从根开始,根为第一层,根的孩子为第二层。
4.二叉树
n个结点的有限集合,集合要么为空树,要么由一个根结点和两棵互不相交,分别称谓根结点的左子树和右子树的二叉树组成。
(1)特点:1,每个结点最多两个子树。
2,左子树和右子树是有顺序的,次序不能颠倒。
3,如果某个结点只有一个子树,也要区分左,右子树。
(2)特殊的二叉树:1,斜树,所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。
2,满二叉树,所有的分支结点都存在左右子树,并且叶子都在同一层上。
3,完全二叉树,对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<=n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这可树为完全二叉树。
(3)特性:1,在二叉树的第i层上最多有2^(i-1)个结点 i>=1
2,深度为k的二叉树至多有2^k -1 个结点 k>=1
3,任意一个二叉树T,如果其叶子结点的个数是n0,度数为2的结点数为n2, n0 = n2 +1;
4,有n个结点的完全二叉树深度为(logn/log 2) +1
(4)二叉树的遍历:前序,根左右,先访问根,然访问左,访问右。
中序,左根右,先从根开始(不是先访问根),从左开始访问,在访问根,在访问右结点。
后序,左右根,先从根开始(不是先访问根),先访问左,在访问右。在访问根。
(5)二叉树的基础操作
①创建二叉树
typedef char DATATYPE;
typedef struct _treenode_
{
DATATYPE data;
struct _treenode_ *left ,*right;
}TreeNode;char data[] = "abd#f###c#eg###";
int ind = 0;
void CreateTree(TreeNode **root)
{
char c = data[ind++];
if('#' == c)
{
*root = NULL;
return ;
}
else
{
*root = malloc(sizeof(TreeNode));
if(NULL == *root)
{
fprintf(stderr,"CreateTree malloc error\n");
return ;
}
(*root) -> data = c;
CreateTree(&(*root) -> left);
CreateTree(&(*root) -> right);
}
}
(2)前序
void PreOrderTraverse(TreeNode *root)
{
if(NULL == root)
{
return ;
}
printf("%c",root -> data);
PreOrderTraverse(root -> left);
PreOrderTraverse(root -> right);
}
(3)中序
void InOrderTraverse(TreeNode *root)
{
if(NULL == root)
{
return ;
}
InOrderTraverse(root -> left);
printf("%c",root -> data);
InOrderTraverse(root -> right);
}
(4)后序
void PostOrderTraverse(TreeNode *root)
{
if(NULL == root)
{
return;
}
PostOrderTraverse(root -> left);
PostOrderTraverse(root -> right);
printf("%c",root -> data);
}
(5)销毁
void DestoryTree(TreeNode *root)
{
if(NULL == root)
{
return ;
}
DestoryTree(root -> left);
DestoryTree(root -> right);
free(root);
}
二、哈希表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef int DATATYPE;
typedef struct
{
DATATYPE *head;
int tlen;
}HSTable;HSTable *CreateHstable(int len)//创建哈希表
{
HSTable *hs = malloc(sizeof(HSTable));
if(NULL == hs)
{
fprintf(stderr,"CreateHstable malloc error");
return ;
}
hs -> head = malloc(sizeof(DATATYPE));
if(NULL == hs -> head)
{
fprint(stderr,"CreateHstable head malloc error");
return ;
}
hs -> tlen = 0;
int i = 0;
for(i = 0;i < len;++i)
{
hs -> head[i] = -1;
}
return hs;
}int HSFun(HSTable *hs,DATATYPE *data)
{
return *data % hs -> tlen;}
int HSInsert(HSTable *hs,DATATYPE *data)//将数据插入哈希表
{
int ind = HSFun(hs, data);
int old_ind = ind;
while (hs->head[ind] != *data)
{
ind = (ind + 1) % hs->tlen;
if (old_ind == ind)
{
return -1;
}
}
return ind;
}int HsSearch(HSTable* hs, DATATYPE* data)//查找
{
int ind = HSFun(hs, data);
int old_ind = ind;
while (hs->head[ind] != *data)
{
ind = (ind + 1) % hs->tlen;
if (old_ind == ind)
{
return -1;
}
}
return ind;
}
int main(int argc, char** argv)
{
HSTable* hs = CreateHsTable(12);
int array[] = {12, 67, 56, 16, 25, 37, 22, 29, 15, 47, 48, 34};
int i = 0;
for (i = 0; i < 12; i++)
{
HSInsert(hs, &array[i]);
}int want_num = 37;
int ret = HsSearch(hs, &want_num);
if (-1 == ret)
{
printf("not find \n");
}
else
{
printf("find ,%d\n", hs->head[ret]);
}
三、内核链表:
1.思想:将数据摘出来,降低代码耦合性,需自己定义结构体,结构体内部包括节点和数据,可按照自己的需求设计。
2.Linux第一宏:offset(地址偏移量) 和 contrainof(求地址)
3.基础操作
(1)klist.c
#include "./klist.h"
void klist_init(KLIST* head)
{
head->prev = head;
head->next = head;
}
void klist_add(KLIST* newnode,KLIST*prev,KLIST* next)
{
newnode->next =next;
newnode->prev = prev;
prev->next = newnode;
next->prev = newnode;
}
void klist_add_head(KLIST* head,KLIST* newnode)
{
klist_add(newnode,head,head->next);
}
void klist_add_tail(KLIST* head,KLIST* newnode)
{
klist_add(newnode,head->prev,head);
}
void klist_del(KLIST*prev,KLIST*next)
{
prev->next = next;
next->prev = prev;
}
(2)klist.h
#ifndef __KLIST_H__
#define __KLIST_H__
typedef struct __klist
{
struct __klist *next;
struct __klist* prev;
}KLIST;
#define offset(type,mem) ((size_t) &((type*)0)->mem)
/**
* @brief ptr 结构体node的指针
type 结构体 per
* mem node在结构中的变量名
*/
#define containerof(ptr,type,mem) ({ const typeof(((type*)0)->mem) * _mptr = (ptr);\
(type*) ((char*)_mptr- offset(type,mem)); })
#define klist_for_entry(ptr,type,mem) containerof(ptr,type,mem)
/**
* @brief p , 指向结构体的指针
* n, 指向当前结构体的下一个指针
head, 链表的头节点指针
mem, node在结构体中变量的名字
*/
//for(p=klist_for_entry(&(head)->next,typeof(*p),mem),n=klist_for_entry((p)->mem.next,typeof(*p),mem);
#define klist_for_each(p,n,head,mem) \
for(p=klist_for_entry(head->next,typeof(*p),mem),n=klist_for_entry((p)->mem.next,typeof(*p),mem);\
&p->mem != (head); p=n,n=klist_for_entry((n)->mem.next,typeof(*n),mem))
// #define offset(type,mem) ((size_t) &((type*)0)->mem)
// #define containerof(p,type,mem) ({\
// const typeof( ((type*)0)->mem ) * _mptr = (p);\
// (type*)((char*)_mptr - offset(type,mem));})
// #define klist_entry(p,type,mem) containerof(p,type,mem)
// #define klist_for_each(p,n,head,node)\
// for(p=klist_entry((head)->next,typeof(*p),node),\
// n=klist_entry(p->node.next,typeof(*p),node); \
// &p->node != (head);p=n,n=klist_entry(n->node.next,typeof(*n),node))
void klist_init(KLIST* head);
void klist_add_head(KLIST* head,KLIST* newnode);
void klist_add_tail(KLIST* head,KLIST* newnode);
void klist_del(KLIST*prev,KLIST*next);
#endif
(3)per.c
#include "./per.h"
#include "klist.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int add_per(int id,char *name,KLIST* head)
{
PER* per = malloc(sizeof(PER));
if(NULL == per)
{
perror("add_per malloc\n");
return 1;
}
strcpy(per->name,name);
per->id = id;
klist_add_tail(head,&per->node);
return 0;
}
int show_per(KLIST* head)
{
PER *p ,*n;
klist_for_each(p,n,head,node)
{
printf("%d %s\n",p->id,p->name);
}
return 0;
}
int del_per(KLIST* head,int id)
{
PER *p ,*n;
klist_for_each(p,n,head,node)
{
//printf("%d %s\n",p->id,p->name);
if(p->id == id)
{
klist_del(p->node.prev, p->node.next);
free(p);
}
}
return 0;
}
(4)per.h
#ifndef __PER_H__
#define __PER_H__
#include "./klist.h"
typedef struct
{
int id;
char name[40];
KLIST node;
} PER;
int add_per(int id,char *name,KLIST* head);
int show_per(KLIST* head);
int del_per(KLIST* head,int id);
#endif
相关文章:

自学嵌入式 day 23 - 数据结构 树状结构 哈希表
一、树状结构 1.特征:在任意一个非空树中, (1),有且仅有一个特定的根结点 (2),当n>1 时,其余结点可分为m个互不相交的有限集合T1,T2,T3.。。。。Tm&…...

JavaScript进阶(十二)
第三部分:JavaScript进阶 目录 第三部分:JavaScript进阶 十二、深浅拷贝 12.1 浅拷贝 12.2 深拷贝 1. 通过递归实现深拷贝 2. js库lodash里面cloneDeep内部实现了深拷贝 3. 通过JSON.stringify()实现 十三、异常处理 13.1 throw抛异常 13.2 try /catch捕获异常 1…...
Honeywell CV-DINA-DI1624-2A 数字输入模块
概述 型号:CV-DINA-DI1624-2A 类型:数字输入模块(16通道,24V DC) 制造商:霍尼韦尔(Honeywell),属于其工业自动化或楼宇控制系统产品线。 主要功能: 采集16路数…...

中文域名25周年,取得哪些里程碑式的进展?
二十五载中文域名路 第八届中文域名创新应用论坛在北京举办。与会领导专家回顾了中文域名发展历史,深入探讨了当下面临的机遇与挑战,并展望了未来的发展。 自2000年中国推出全球首个中文域名试验系统以来,中文域名已走过25年历程,…...
HTTP协议接口三种测试方法之-postman
HTTP协议作为现代Web开发的基石,其接口测试是开发过程中不可或缺的环节。Postman作为最流行的API测试工具之一,能够极大提升我们的测试效率。本文将详细介绍如何使用Postman进行HTTP接口测试。 一、HTTP协议基础回顾 在开始使用Postman之前,我们先简单回顾下HTTP协议的基本…...
【Linux cmd】查看 CPU 使用率的几个命令
1、查看 CPU 使用情况 dstat -c usr 用户sys 系统idl 空闲 2、查看最占 CPU 的进程 dstat --top-cpu...
架空线路监控系统是针对高压架空输电线路设计的一种安全监测解决方案
一、系统介绍 架空线路监控系统是在传统电网线路传输结构的基础上,增设的线路传输无线监控装置。它能够对高压传输线路自身危险点进行监控,也可以对线路闪络、线路舞动、线路二次回流、高压漏电等电力传输故障进行综合检验,是现代电力传输安…...
Kotlin Compose Button 实现长按监听并实现动画效果
想要实现长按按钮开始录音,松开发送的功能。发现 Button 这个控件如果去监听这些按下,松开,长按等事件,发现是不会触发的,究其原因是 Button 已经提前消耗了这些事件所以导致,这些监听无法被触发。因此为了…...

应对进行性核上性麻痹,健康护理铸就温暖防线
进行性核上性麻痹(PSP)是一种罕见的神经退行性疾病,主要影响患者的运动、平衡及吞咽等功能。针对这类患者,有效的健康护理对提升其生活质量、延缓病情发展至关重要。 在日常生活护理方面,由于患者存在平衡障碍和肌肉僵…...

python邮件地址检验 2024年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析
python邮件地址检验 2024全国青少年信息素养大赛Python编程挑战赛复赛真题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解 蓝桥杯python省赛真题详解 蓝桥杯python国赛真题详解 2、…...

CAD球体功能梯度材料3D插件
插件介绍 CAD球体功能梯度材料3D插件可在AutoCAD内建立大小呈现梯度分布的球体及长方体孔隙三维模型。 功能梯度材料(FGM)模型包含大小梯度变化的球体及与之适配的长方体部件,可用于球体材料的梯度分布或梯度多孔结构材料建模。 插件支持…...

自制操作系统day9内存管理(cache、位图、列表管理、内存的释放)(ai辅助整理)
day9内存管理 整理源文件(harib06a) 残留问题:鼠标指针的叠加处理不太顺利,以后处理 先介绍cache(高速缓存) 每次访问内存,都将所访问的地址和内容存入高速缓存, 往内存里写入数据…...

JavaWebsocket-demo
Websocket客户端 pom依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.4.0</version></dependency>客户端代码片段 Component Slf4j public class PositionAlarmL…...

特征学习:赋予机器学习 “慧眼” 的核心技术
一、特征学习:从人工设计到智能发现的范式革新 1.1 核心定义与价值 特征学习的本质是让机器模仿人类大脑的认知过程 —— 例如,人类视觉系统通过视网膜→视神经→大脑皮层的层级处理,从像素中识别物体;特征学习则通过神经网络的卷…...

3D个人简历网站 7.联系我
3D个人简历网站 7.联系我 修改Contact.jsx // 从 react 库导入 useRef 和 useState hooks import { useRef, useState } from "react";/*** Contact 组件,用于展示联系表单,处理用户表单输入和提交。* returns {JSX.Element} 包含联系表单的 …...

软考中级软件设计师——计算机系统篇
一、数据的表示和运算 1、进制转换 1. 常见进制类型 二进制(B):基数为2(0,1),计算机底层使用。 八进制(O):基数为8(0-7),3位二进制…...

甘特图(项目计划图)
甘特图是甘特在第一次世界大战时为了提供工人效率所创。 由时间(顶部横坐标)和工作事项(左边纵坐标组成) 假设,我要做大数据迁移(一般半年,几PB的数据和上万个任务) 类似于这种...
Java流式处理-Steam详解
Java 8 引入的 Stream API 是一种强大的处理集合数据的工具,它允许你以声明式方式处理数据集合(如 List、Set 等),并支持多种聚合操作(如过滤、映射、排序、归约等)。Stream API 可以显著提高代码的可读性和…...

windows服务器部署jenkins工具(一)
jenkins作为一款常用的构建发布工具,极大的简化了项目部署发布流程。jenkins通常是部署在linux服务上,今天给大家分享的是windows服务器上如何搭建jenkins发布工具。 1.首先第一步还是看windows安装docker 这篇文章哈,当然也可以不采用docke…...
LCS4110R加密芯片在打印机墨盒的应用
在打印机耗材行业,始终有一部分用户在谋求以某种方式破解、绕开厂商采取的各种限制措施使用第三方墨盒,低价克隆墨盒泛滥导致原厂利润流失、用户体验下降,甚至引发设备损坏风险。所以墨盒的兼容性与安全性一直是品牌商与用户的共同痛点。如何…...
什么是 API 管理?为什么管理 API 很重要?如何用 iPaaS 平台管理 API
在当今数字化浪潮下,API(ApplicationProgrammingInterface,应用程序编程接口)作为连接不同系统、应用程序与设备的关键桥梁,其重要性日益凸显。而API管理则是把控API全生命周期,使其稳定、可靠、安全运转并…...

基于51单片机和8X8点阵屏、独立按键的飞行躲闪类小游戏
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示ÿ…...

告别“盘丝洞”车间:4-20mA无线传输如何重构工厂神经网?
4-20ma无线传输是利用无线模块将传统的温度、压力、液位等4-20mA电流信号转换为无线信号进行传输。这一技术突破了有线传输的限制,使得信号可以在更广泛的范围内进行灵活、快速的传递,无线传输距离可达到50KM。达泰4-20ma无线传输模块在实现工业现场应用…...

VMware虚拟机突然无法ssh连接
遇到的情况: 功能全部正常的情况下,没有修改任何配置,重启电脑之后无法ssh连接 其实不太可能的可能原因: 1、虚拟机内部sshd服务未运行 systemctl status sshd systemctl start sshd 2、检查SSH端口监听 netstat -an | grep :…...
Android帧抢占协议技术剖析:触摸事件与UI绘制的智能调度优化方案
简介 在移动应用开发中,触摸事件响应与UI绘制的同步竞争是导致卡顿和掉帧的主要原因之一。腾讯工程师提出的优先级策略通过紧急事件抢占、增量渲染机制和时间片补偿技术,有效解决了这一竞争问题。本文将深入分析这些技术原理,并提供完整的代码实现,帮助开发者构建更流畅的…...
Maven 项目介绍
一、Maven 概述 Maven 是一个基于 Java 的项目管理和构建自动化工具,由 Apache 软件基金会开发。它采用 “约定优于配置”(Convention Over Configuration)的原则,通过标准化的项目结构和配置,极大地简化了项目的构建…...

班迪录屏--解决视频剪辑时声音和画面不同步的问题
原文网址:班迪录屏--解决视频剪辑时声音和画面不同步的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何用班迪录屏解决视频剪辑时声音和画面不同步的问题。 问题描述 我用班迪录屏录了视频,用剪映进行剪辑,结果发现在剪辑时声音和画面…...

Git上传项目到GitHub
Git上传项目到GitHub 下载Git客户端配置Git设置GitHub上传本地项目到Github 下载Git客户端 网址:Git Windows客户端。选择Standalone Installer(单独安装程序),并点击64bit Git for Windows Setup(64位Git for Windows安装程序)进行下载。然后一路默认选…...

【工具】Quicker/VBA|PPT 在指定位置添加有颜色的参考线
文章目录 效果展示使用方式技术原理更多原理ActivePresentation.Guides 概述主要属性和方法使用示例添加水平参考线添加垂直参考线删除所有参考线获取参考线数量 注意事项 致谢 效果展示 先展示效果: Quicker 动作:VBA 添加参考线 - Quicker 动作 使用…...

第34节:迁移学习中的特征提取方法
迁移学习中的特征提取方法:原理、技术与应用 1. 迁移学习与特征提取概述 迁移学习(Transfer Learning)作为机器学习领域的重要范式 通过将源领域(source domain)学到的知识迁移到目标领域(target domain),有效解决了传统机器学习需要大量标注数据的瓶颈问题。 在迁…...