自学嵌入式 day21 - 数据结构 双向链表
1.双向链表
2.基础操作
(1)头部插入
int InsertHeadDouLinkList(DouLinkList *dl,DATATYPE *data)
{
DouLinkNode *newnode = (DouLinkNode *)malloc(sizeof(DouLinkNode));//定义新节点来存储需插入的数据
if(NULL == newnode)//判断结点空间是否申请成功
{
fprintf(stderr,"intertHeadDouLinkList malloc");
return 1;
}
memcpy(&newnode -> data,data,sizeof(DATATYPE));//将需插入的数据装入新结点
//初始化新结点中的指针内容newnode -> next = NULL;
newnode -> prev = NULL;
newnode -> next = dl -> head;//连接新结点和链表
if(dl -> head)//判断链表是否为空
{
dl -> head -> prev = newnode;
}
dl -> head = newnode;//连接头指针与新结点
dl -> clen++;
return 0;
}
(2)打印(正向打印,反向打印)
int ShowDouLinkList(DouLinkList *dl,DIR dir)
{
if(FORWADR == dir)//正向打印
{
DouLinkNode *tmp = dl -> head;
while(tmp)//遍历
{
printf("%s,%c,%d,%d\n",tmp -> data.name,tmp -> data.sex,tmp -> data.age,tmp -> data.score);
tmp = tmp -> next;
}
}
else if(BACKWADR == dir)//反向打印,从末尾开始向前打印
{
DouLinkNode *tmp = dl -> head;
while(tmp -> next)//遍历链表,使初始位置指向最后结点
{
tmp = tmp -> next;
}
while(tmp)//反向遍历链表
{
printf("%s,%c,%d,%d\n",tmp -> data.name,tmp -> data.sex,tmp -> data.age,tmp -> data.score);
tmp = tmp -> prev;
}
}
}
(3)尾部插入
int IsEmptyLinkList(DouLinkList *dl)
{
return 0 == dl -> clen;
}int InsertTaiDouLinkList(DouLinkList *dl,DATATYPE *data)
{
if(IsEmptyLinkList(dl))//判断链表是否为空
{
return InsertHeadDouLinkList(dl,data);
}
else
{
DouLinkNode *newnode = malloc(sizeof(DouLinkNode));//申请新结点存储待插入数据
if(NULL == newnode)//判断新结点空间是否申请成功
{
fprintf(stderr,"insertTaiDouLinkList malloc\n");
return 1;
}
memcpy(&newnode -> data,data,sizeof(DATATYPE));//存入待插入数据
newnode -> next = NULL;//初始化新结点指针
newnode -> prev = NULL;
DouLinkNode *tmp = dl -> head;//定义新指针,指向头指针
while(tmp -> next)//遍历链表
{
tmp = tmp -> next;
}
newnode -> prev = tmp;//将新结点插入链表尾部
tmp -> next = newnode;
dl -> clen++;
}
return 0;
}
(4)指定位置插入
int GetsizeofDouLinkList(DouLinkList *dl)
{
return dl -> clen;
}int InsertPosDouLinkList(DouLinkList *dl,DATATYPE *data,int pos)
{
int len = GetsizeofDouLinkList(dl);//算出链表长度
if(0 == pos)//头部插入
{
return InsertHeadDouLinkList(dl,data);
}
else if(pos == len)//尾部插入
{
return InsertTaiDouLinkList(dl,data);
}
else
{
DouLinkNode *newnode = malloc(sizeof(DouLinkNode));
if(NULL == newnode)
{
fprintf(stderr,"InsertPosDouLinkList malloc\n");
return 1;
}
memcpy(&newnode -> data,data,sizeof(DATATYPE));
newnode -> next = NULL;
newnode -> prev = NULL;
DouLinkNode *tmp = dl -> head;
for(int i = 0;i < pos;++i)//遍历链表,定位待插位置
{
tmp = tmp -> next;
}
newnode -> next = tmp;//将新结点和待插位置的前结点和后结点连接
newnode -> prev = tmp -> prev;
tmp -> prev = newnode;
newnode -> prev ->next = newnode;
dl ->clen++;}
return 0;
}
(5)查找
DouLinkNode *FindDouLinkList(DouLinkList *dl,char *name)
{
int len = GetsizeofDouLinkList(dl);//获取链表长度
DouLinkNode *tmp = dl -> head;//定义新指针,指向头指针
for(int i = 0;i < len;++i)//遍历链表
{
if(0 == strcmp(tmp -> data.name,name))//用已给name查找结点
{
return tmp;
}
tmp = tmp -> next;
}
return NULL;
}
(6)替换
int ModifyDouLinkLinst(DouLinkList *dl,char *name,DATATYPE *data)
{
DouLinkNode *ret = FindDouLinkList(dl,name);//查找结点
if(NULL == ret)//判断是否找到结点
{
return 1;
}
memcpy(&ret -> data,data,sizeof(DATATYPE));//替换数据
return 0;
}
练习:
(1)销毁
int DestroyDouLinkList(struct DouLinkList* dl)
{
DouLinkNode *tmp = dl -> head;//定义新指针,指向头指针
DouLinkNode *ret ;
while(tmp)//遍历链表
{
ret = tmp;
tmp = tmp -> next;
free(ret);//释放结点空间
ret = NULL;
}
free(dl);
dl = NULL;
return 0;}
(2)删除
int DeleteDouLinkList(struct DouLinkList* dl,char* name)
{
DouLinkNode *tmp = FindDouLinkList(dl,name);//查找待删结点
if(NULL == tmp -> prev)//头删
{
dl -> head = tmp -> next;
tmp -> next -> prev = NULL;
dl -> clen--;
free(tmp);
tmp = NULL;
return 0;
}
else if(NULL == tmp -> next)//尾删
{
tmp -> prev -> next = NULL;
dl -> clen--;
free(tmp);
tmp = NULL;
return 0;
}
else
{
tmp -> prev ->next = tmp -> next;
tmp -> next ->prev = tmp -> prev;
dl -> clen--;
free(tmp);
tmp = NULL;
return 0;
}
}
(3)逆序
int RevertDouLinkList(struct DouLinkList* dl)
{
DouLinkNode *p = NULL;//定义一个指向被逆转结点的指针,初始位空指针
DouLinkNode *tmp = dl -> head;//定义一个指向待逆转结点的指针,初始化位头指针
DouLinkNode *n = tmp ->next;//定义一个指向待逆转结点next的指针,辅助遍历链表
int len = GetsizeofDouLinkList(dl);
if(len < 2)//逆序链表长度必须大于1
{
return 1;
}
while(1)
{
tmp -> next = p;//将待逆序结点指向被逆序节点
tmp -> prev = n;p = tmp;//p++
tmp = n;//tmp++
if(NULL == tmp)//判断指针是否为空
{
break;//指针为空时结束循环
}
n = n -> next;//n++}
dl -> head = p;//将头指针指向已逆序后的链表首位
return 0;
}
注:
1.Makefile: vi Makefile
自动指定编译
(1)简单编译设置
(2)复杂编译设置
相关文章:
自学嵌入式 day21 - 数据结构 双向链表
1.双向链表 2.基础操作 (1)头部插入 int InsertHeadDouLinkList(DouLinkList *dl,DATATYPE *data) { DouLinkNode *newnode (DouLinkNode *)malloc(sizeof(DouLinkNode));//定义新节点来存储需插入的数据 if(NULL newnode)//判断结点空间…...
Ubuntu 22.04安装zabbix7.0.0图形中文乱码
在 Ubuntu 22.04 上安装 Zabbix 7.0.0 时,如果图形界面(如仪表盘、图表)出现中文乱码,通常是因为缺少中文字体或字体配置不正确。以下是完整的解决方案: 1. 安装中文字体 安装 fonts-wqy-microhei(文泉驿微…...
docker环境和dockerfile制作
docker 一、环境和安装 1、 docker安装 使用 root 权限登录 CentOS。确保 yum 包更新到最新sudo yum update卸载旧版本yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux …...
《经济日报》深度聚焦|珈和科技携手万果博览荟共筑智慧农业新示范高地 全链赋能蒲江茶果产业数字化转型升级
近日,《经济日报》深度聚焦报道了《珈和科技携手万果博览荟打造智慧农业新示范 双轮驱动绘就西南农业全链发展新篇章》。 作为国家级重点财经新闻媒体,《经济日报》对珈和科技与蒲江县人民政府战略合作签约,成立四川珈和科技子公司落地万果博…...
科技赋能·长效治理|无忧树建筑修缮渗漏水长效治理交流会圆满举行!
聚焦行业痛点,共话长效未来!5月16日,由无忧树主办的主题为“科技赋能长效治理”的建筑修缮渗漏水长效治理技术交流会在上海圆满举行。来自全国的建筑企业代表、专家学者、技术精英齐聚一堂,共探渗漏治理前沿技术,见证科…...
文章记单词 | 第100篇(六级)
一,单词释义 immediate /ɪˈmiːdiət/ adj. 立即的;直接的;紧迫的hypothesis /haɪˈpɑːθəsɪs/ n. 假设;假说(复数:hypotheses)disregard /ˌdɪsrɪˈɡɑːrd/ v./n. 忽视;…...
React表单开发的瑞士军刀:Formik与Yup实战指南
——揭秘高效表单开发的黄金公式 开篇:一场关于效率的革命 2023年某日凌晨,某互联网大厂会议室灯火通明。前端团队正为表单校验逻辑争论不休: “每次写表单都要重复处理触碰状态、错误消息、异步验证…” “受控组件状态管理太繁琐…...
瑞莎星睿 O6 (Radxa Orion O6)-ubuntu24.04-ROS2 运行深度估计模型
引言 由Radxa联合此芯科技与安谋科技打造的"星睿O6"迷你ITX主板堪称当前最受期待的开发板之一。该产品搭载的CIX P1(CD8180)12核Armv9处理器配合30TOPS算力的NPU和高性能GPU,结合最高64GB LPDDR内存,非常适合AI开发工作…...
【ubuntu】虚拟机连不上网,且网络中没有有线连接
错误图示 sudo gedit /etc/NetworkManager/NetworkManager.conf managedtruesudo gedit /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf 添加except:type:ethernet,然后重启 sudo service network-manager stop sudo rm /var/lib/NetworkManager/Networ…...
Ubuntu软件仓库与更新源配置指南
一、软件仓库基础知识 软件仓库的作用 Ubuntu 通过预设的软件仓库(Repository)提供软件包,包含系统核心组件、第三方应用及安全更新。仓库分为: Main:官方维护的自由开源软件 Universe:社区维护的自由开源…...
Docker run -v 的 rw 和 ro 模式_docker ro
一、前言 在使用 Docker 启动容器时,通常需要将宿主机的文件或目录挂载到容器中,以便于管理配置、持久化数据和调试日志。本篇博客将重点介绍 -v/--volume 参数的使用方式、挂载权限(rw 与 ro)的区别,以及如何通过 do…...
React+TypeScript多步骤表单:告别表单地狱的现代解决方案
开篇:深夜的表单困局 凌晨两点,键盘声在寂静的办公室回响。前端工程师小李盯着屏幕上的错误提示:“类型"FormData"上不存在属性’email’”。这已经是本周第三次因为字段名拼写错误导致的调试灾难。他揉着发酸的眼睛想:…...
【工具使用】STM32CubeMX-USB配置-实现U盘功能
一、概述 无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。 本文主要讲述STM32芯片USB功能的配置及其相关知识。 二…...
【LUT技术专题】DnLUT代码解读
目录 原文概要 1. 训练 本文是对DnLUT技术的代码解读,原文解读请看DnLUT。 原文概要 DnLUT通过PCM模块和L型卷积,有效提升以往基于LUT方法降低色噪声的能力,用最小的存储量得到了同样的感受野范围,主要是2个创新点࿱…...
python宠物用品商城系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
2156. 查找给定哈希值的子串
给定整数 p 和 m ,一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算: hash(s, p, m) (val(s[0]) * p0 val(s[1]) * p1 ... val(s[k-1]) * pk-1) mod m. 其中 val(s[i]) 表示 s[i] 在字母表中的下标,从 val(a) 1 到 v…...
Index-AniSora技术升级开源:动漫视频生成强化学习
B站升级动画视频生成模型Index-AniSora技术并开源,支持番剧、国创、漫改动画、VTuber、动画PV、鬼畜动画等多种二次元风格视频镜头一键生成! 整个工作技术原理基于B站提出的 AniSora: Exploring the Frontiers of Animation Video Generation in the So…...
游戏引擎学习第297天:将实体分离到Z层中
回顾并为今天的内容做准备 昨天我们做了雾效混合(fog blend)和透明度混合(alpha blending)的尝试,现在正在进行渲染部分的深度(Z)清理工作。今天的重点是把“切片”(slices…...
全局对比度调整
目录 一、全局对比度调整原理 二、饱和度保持 一、全局对比度调整原理 Figure1.2 展示了一幅全局对比度较低的图像及其亮度直方图。该直方图分布范围较窄,像素的强度仅集中在中间调区域,不存在明亮或深色的像素,因此图像中的细节难以区分,可用动态范围未得到有效利用。在动…...
Canvas SVG BpmnJS编辑器中Canvas与SVG职能详解
Canvas详解与常见API 一、Canvas基础 核心特性 • 像素级绘图:Canvas是基于位图的绘图技术,通过JavaScript操作像素实现图形渲染,适合动态、高性能场景(如游戏、数据可视化)。 • 即时模式:每次绘制需手动…...
【图像大模型】Stable Diffusion 3 Medium:多模态扩散模型的技术突破与实践指南
Stable Diffusion 3 Medium:多模态扩散模型的技术突破与实践指南 一、架构设计与技术演进1.1 核心架构革新1.2 关键技术突破1.2.1 整流流(Rectified Flow)1.2.2 动态掩码训练 二、系统架构解析2.1 完整推理流程2.2 性能对比 三、实战部署指南…...
PID项目---硬件设计
该项目是立创训练营项目,这些是我个人学习的记录,记得比较潦草 1.硬件-电路原理电赛-TI-基于MSPM0的简易PID项目_哔哩哔哩_bilibili 这个地方接地是静电的考量 这个保护二极管是为了在电源接反的时候保护电脑等设备 大电容的作用:当电机工作…...
渗透测试流程
2.1 信息收集 2.1.1 资产监控与架构分析 目标:明确目标范围(IP、域名、子公司资产),识别网络架构(云服务/CDN/反向代理)。 工具与技巧: 使用FOFA、Shodan搜索关联资产(如title="目标公司")。 通过nslookup或dig解析域名,确认真实IP是否隐藏于CDN…...
PCIe EP/RC 核心功能解释
1. Bar访问(BAR Access) BAR(Base Address Register) 是 PCIe 设备上的 地址窗口,用于主机与设备之间的 寄存器访问。功能: 主机通过 BAR 访问 EP 卡的 控制寄存器 或 数据缓冲区。每个 BAR 对应一段物理内…...
srs-7.0 支持obs推webrtc流
demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 实现原理就是通过WHIP协议来传输 SDP信息 1、运行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打开web:ht...
SQLynx 团队协作实践:提升数据库开发效率的解决方案
在数据库开发与管理场景中,团队协作的效率直接影响项目进度与质量。传统协作方式常面临权限混乱、代码复用率低、跨地域协作困难等问题,而 SQLynx 作为一款轻量化 Web SQL 工具,凭借其独特的团队协作功能,为这些难题提供了有效解决…...
基于自然语言转SQL的BI准确率如何?
基于自然语言转SQL的商业智能(BI)工具的准确率受多种因素影响,目前整体处于中等偏上水平,但尚未达到完全精准的程度。以下从技术原理、影响准确率的因素、实际应用场景及未来趋势等方面展开分析: 一、技术原理与当前准…...
「华为」持续加码人形机器人赛道!
温馨提示:查看运营团队2025年最新原创报告(共210页) —— 正文: 现阶段,全球大厂入局具身智能赛道典型代表:[英伟达]和[特斯拉],是全球科技巨头/大厂(谷歌、微软、Meta、OpenAI、华…...
Visual Studio 2022 无法编译.NET 9 项目的原因和解决方法
Visual Studio 2022 无法运行.NET 9 项目的原因和解决方法。 目录 1. Visual Studio 2022 无法编译TargetFramework是.NET 9 项目 2. 解决方法 3. 用Visual Studio Code开发 1. Visual Studio 2022 无法编译TargetFramework是.NET 9 项目 本机安装了Visual Studio 2022 版…...
C++从入门到实战(十六)String(中)String的常用接口(构造接口,析构接口,迭代器,遍历修改,容量管理与数据访问)
C从入门到实战(十六)String(中)详细讲解String的常用接口 前言一、std::string二、string的构造接口1. 默认构造函数:创建空字符串2. 拷贝构造函数:复制已有字符串3. 从已有字符串截取部分4. 用C风格字符串…...
RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性
幂等性保障 幂等性(Idempotency) 是计算机科学和网络通信中的一个重要概念,指的是某个操作无论被执行多少次,所产生的效果与执行一次的效果相同。 应用程序的幂等性: 在应用程序中,幂等性就是指对一个系统…...
go.mod:5: unknown directive: toolchain
Go语言版本较旧,而项目使用了较新版本的Go语言特性。错误信息"unknown directive: toolchain"表明go.mod文件中使用了"toolchain"指令,这是在Go 1.21版本中新引入的特性,但您当前安装的Go版本不支持这个指令。 解决方法…...
分布式序列生成方案 : Redis Incr | 基于Redisson创建自增获取序号,每天更换一个key, key到期时间1天,用于创建订单号、快递单号
文章目录 引言I 在 Spring Boot 应用程序中集成 Redisson1. Maven2. 配置 Redisson 客户端3. 创建 Redisson 配置类4. 自动装配 RedissonClientII 应用: 基于Redisson创建自增获取序号生成每日自增序号创建订单号创建快递单号封装 :系统自动生成单号引言 应用: 创建订单号、…...
Android7 Input(八)App Input事件接收器InputEventReceiver
概述 上一个章节,我们讲解了App如何使用InputChannel通道与input系统服务建立通信的桥梁的过程,本章我们讲述App如何从input系统服务中获取上报的输入事件,也就是我们本章讲述的InputEventReceiver。 本文涉及的源码路径 frameworks/base/c…...
阿里云服务器Ubuntu的git clone失败问题解决方案
一、问题 我们再使用阿里云服务器或者别的服务器,git clone失败 二、解决方案 1. 确认SSH密钥是否存在并正确配置 检查密钥文件: ls -al ~/.ssh 确认存在 id_rsa(私钥)和 id_rsa.pub(公钥ÿ…...
Mujoco 学习系列(二)基础功能与xml使用
这篇文章是 Mujoco 学习系列第二篇,主要介绍一些基础功能与 xmI 使用,重点在于如何编写与读懂 xml 文件。 运行这篇博客前请先确保正确安装 Mujoco 并通过了基本功能与GUI的验证,即至少完整下面这个博客的 第二章节 内容: Mujoc…...
8 定时任务与周期性调度
在构建复杂的分布式系统时,我们经常会遇到需要“定时”或“周期性”执行的任务。比如,每天凌晨生成报表,每小时同步一次数据,或者在特定时间发送提醒邮件。这些任务如果都依赖人工触发,不仅效率低下,而且容…...
idea 插件开发自动发布到 nexus 私服中(脚本实例)
如下脚本内容为 idea 插件开发项目中的 build.gradle.kts 文件示例,其中自定了 updatePluginsXml 和 uploadPluginToNexus 两个任务,一个用来自动修改 nexus 中的配置文件,一个用来自动将当前插件打包后的 zip 文件上传到 nexus 私服中。 脚…...
关于 APK 反编译与重构工具集
一、apktool — APK 解包 / 重打包 apktool 是一款开源的 Android APK 工具,用于: 反编译 APK 查看资源和布局文件 生成 smali 文件(DEX 的反汇编) 对 APK 进行修改后重新打包 它不能还原 Java 源码,只能将 D…...
【课堂笔记】核方法和Mercer定理
文章目录 Kernal引入定义Mercer定理描述有限情形证明一般情形证明 Kernal 引入 在实际数据中常常遇到不可线性分割的情况,此时通常需要将其映射到高维空间中,使其变得线性可分。例如二维数据: 通过映射 ϕ ( x 1 , x 2 ) ( x 1 2 , 2 x 1…...
Cribl 中 Parser 扮演着重要的角色 + 例子
先看文档: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…...
MVDR源码(可直接运行)
该代码可正常运行,信号使用的是模拟信号,可改为指定信号。 本代码使用了一个基于MVDR(最小方差无失真响应)算法的麦克风阵列声源定位方法。代码首先设置了麦克风阵列的参数,包括阵元数量、采样率、信号频率等ÿ…...
MyBatis实战指南(一)MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统
MyBatis实战指南(一)MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统 一、什么是MyBatis1. MyBatis 是什么?2. JDBC 的三大痛点3. MyBatis 的核心优势1. 告别重复代码,专注核心逻辑2. 灵活控制 SQL,适应各…...
React Flow 数据持久化:Django 后端存储与加载的最佳实践(含详细代码解析)
在构建 React Flow 应用时,前端呈现的节点与连线构成的可视化流程只是冰山一角,其背后的数据持久化与灵活调取才是确保应用稳定运行、支持用户数据回溯与协作的关键。因此,后端存储与加载 React Flow 信息的环节,就如同整个应用的…...
第32节:基于ImageNet预训练模型的迁移学习与微调
1. 引言 在深度学习领域,迁移学习(Transfer Learning)已经成为解决计算机视觉任务的重要方法,特别是在数据量有限的情况下。其中,基于ImageNet数据集预训练的模型因其强大的特征提取能力而被广泛应用于各种视觉任务。本文将详细介绍迁移学习的概念、ImageNet预训练模型的特…...
接口自动化可视化展示
目的将接口返回的实际对比返回 前端:使用Geeker-Admin二次开发使用 后端 flaskpythonrequests 实际实现展示 接口测试通过 接口测试不通过 接口数据的增删改查...
Hbuilder X4.65新建vue3项目存在的问题以及解决办法
有关Vue的多篇文章: 1.使用Vue创建前后端分离项目的过程:使用Vue创建前后端分离项目的过程(前端部分)_vue前端项目打包的dish-CSDN博客 2.vue3实现自定义导航菜单:vue3实现自定义导航菜单_vue3 导航栏-CSDN博客 3…...
SpringBoot 项目实现操作日志的记录(使用 AOP 注解模式)
本文是博主在做关于如何记录用户操作日志时做的记录,常见的项目中难免存在一些需要记录重要日志的部分,例如权限和角色设定,重要数据的操作等部分。 博主使用 Spring 中的 AOP 功能,结合注解的方式,对用户操作过的一些…...
C/C++ 整数类型的长度
参考 cppreference.cn 在某些语言中,整数类型的长度是固定的,如java中 char 8short 16int 32long 64 可是C/C 与机器相关,整数类型长度与平台有关 先可以记一个简单的 按照C标准: char > 8short > 16int > 16long &g…...
解决npm install报错:getaddrinfo ENOTFOUND registry.nlark.com
问题背景 在使用 npm install 安装依赖时,突然遇到以下错误: npm ERR! network request to https://registry.nlark.com/fsevents/download/fsevents-2.3.2.tgz failed, reason: getaddrinfo ENOTFOUND registry.nlark.com这表明 npm 在尝试从 registr…...