嵌入式学习笔记DAY21(双向链表、Makefile)
一、双向链表
1.概念
双向链表(Doubly Linked List) 是一种链式数据结构,每个节点包含 两个指针(前驱指针 prev
和后继指针 next
),分别指向 前一个节点 和 后一个节点,形成双向连接。
- 头节点(Head):链表的起始节点,
prev
指针通常为NULL
(若链表不带头节点,则头节点直接指向第一个有效节点)。 - 尾节点(Tail):链表的最后一个节点,
next
指针为NULL
。
2. 节点结构
struct DATATYPE
{char name[10];char sex;int age;int score;};struct DOUNode
{
struct DATATYPE data;
struct DOUNode* next;
struct DOUNode* prev;
};struct DouLinkList
{struct DOUNode* head;int clen;
};// 定义DIR枚举类型
typedef enum {FORWARD,BACKWARD
} DIR;
3.特点
特点 说明 双向遍历 可从头节点正向遍历( next
),也可从尾节点反向遍历(prev
)。灵活删除 / 插入 修改节点的 prev
和next
指针即可完成操作,无需像单链表一样依赖前驱节点。空间开销 每个节点需额外存储 prev
指针,空间复杂度为 O(n)(n 为节点数)。对称性 节点的前驱和后继指针形成对称结构,适合实现需要双向操作的场景(如双向队列)。
4.练习
- 创建双向链表
struct DouLinkList* CreateDouLinkList()
{struct DouLinkList* dl = (struct DouLinkList* )malloc(sizeof(struct DouLinkList));if(NULL == dl){fprintf(stderr,"CreatDouLinkList malloc");return NULL;}dl->head = NULL;dl->clen = 0;return dl;}
- 头插法
int InsertHeadDouLinkList(struct DouLinkList* dl, struct DATATYPE* data)
{// 检查输入参数是否合法if (dl == NULL || data == NULL) {return 1; // 输入参数无效}// 分配新节点内存struct DOUNode* newnode = (struct DOUNode*)malloc(sizeof(struct DOUNode));if (newnode == NULL) {fprintf(stderr, "inserthead malloc failed\n");return 1; // 内存分配失败}// 复制数据到新节点memcpy(&newnode->data, data, sizeof(struct DATATYPE));// 初始化新节点的指针newnode->next = dl->head; // 新节点的后继指向原头节点newnode->prev = NULL; // 新节点的前驱为NULL(因为是头节点)// 更新原头节点的前驱指针(如果原链表不为空)if (dl->head != NULL) {dl->head->prev = newnode;}// 更新链表头指针dl->head = newnode;// 更新链表长度dl->clen++;return 0; // 插入成功
}
- 遍历链表
int ShowDouLinkList(struct DouLinkList* dl, DIR dir)
{// 检查链表是否为空if (dl == NULL || dl->head == NULL) {printf("链表为空\n");return 1; // 链表为空,返回错误码}// 初始化临时指针,用于遍历链表struct DOUNode* tmp = dl->head;// 向前遍历(从头节点开始)if (FORWARD == dir){// 从头节点开始,沿next指针遍历至尾节点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 (BACKWARD == dir){// 1. 先找到尾节点:通过循环移动到最后一个节点while(tmp->next){tmp = tmp->next;} // 循环结束时,tmp指向尾节点// 2. 从尾节点开始,沿prev指针向前遍历至头节点while(tmp){// 打印当前节点数据printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);// 移动至上一个节点tmp = tmp->prev;}}// 其他情况(无效方向参数)else{printf("错误:未知的遍历方向\n");return 1; // 方向参数错误,返回错误码}return 0; // 成功遍历完成
}
- 尾插
int InsertTailDouLinkList(struct DouLinkList* dl, struct DATATYPE* data)
{// 检查输入参数合法性if (dl == NULL || data == NULL) {printf("错误:链表或数据指针为空\n");return 1; // 输入无效,返回错误码}// 创建新节点并分配内存struct DOUNode* newNode = (struct DOUNode*)malloc(sizeof(struct DOUNode));if (newNode == NULL) {fprintf(stderr, "内存分配失败\n");return 1; // 内存分配失败,返回错误码}// 复制数据到新节点memcpy(&newNode->data, data, sizeof(struct DATATYPE));newNode->next = NULL; // 尾节点的next始终为NULLnewNode->prev = NULL; // 初始化为NULL,后续可能更新// 1:链表为空,新节点直接成为头节点if (dl->head == NULL) {return InsertHeadDouLinkList(dl, data);}// 2:链表非空,找到尾节点并插入else {//先定义一个tail节点指向头struct DOUNode* tail = dl->head;// 遍历到尾节点(最后一个节点)while (tail->next != NULL) {tail = tail->next;}tail->next = newNode; // 原来尾节点的next指向新节点newNode->prev = tail; // 新节点的prev指向原来的尾节点}dl->clen++;return 0;
}
- 按位置插入
int InserAtPosDouLinkList(struct DouLinkList* dl,int pos,struct DATATYPE* data)
{int len = GetSizeDouLinkList(dl);if(pos < 0 || pos > len){return 1;}if(0 == pos){return InsertHeadDouLinkList(dl, data);}else if(pos == len){return InsertTailDouLinkList(dl, data);}else{struct DOUNode* newnode = (struct DOUNode*)malloc(sizeof(struct DOUNode));if (NULL == newnode) {fprintf(stderr, "内存分配失败\n");return 1; // 内存分配失败,返回错误码}memcpy(&newnode->data, data, sizeof(struct DOUNode));newnode->prev = NULL; newnode->next = NULL;//节点初始化struct DOUNode* tmp = dl->head;int i = 0;for(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;}
- 查找
struct DOUNode* FindDouLinkList(struct DouLinkList* dl, char* name)
{if (dl == NULL || dl->head == NULL) {return NULL; // 链表为空,直接返回NULL}struct DOUNode* tmp = dl->head;while (tmp != NULL) {if (strcmp(tmp->data.name, name) == 0) {return tmp; // 找到匹配节点,返回数据指针}tmp = tmp->next; // 移动到下一个节点}return NULL; // 未找到匹配节点
}
- 修改
nt ModifyDouLinkList(struct DouLinkList* dl,char *name,struct DATATYPE* data)
{struct DOUNode* ret = FindDouLinkList(dl,name);if(NULL == ret){return 1;}memcpy(&ret->data,data,sizeof(struct DATATYPE));return 0;ModifyDouLinkList(dl,"zhang",&data[5]);printf("---------modify-------------\n");ShowDouLinkList(dl,FORWARD);}
二、makefile
Makefile 是一种由 make 工具 读取和执行的脚本文件,主要用于 自动化编译和构建程序。它通过定义文件间的依赖关系和编译规则,让开发者只需一个简单的命令(如 make
)就能完成复杂的项目编译过程,避免手动输入大量编译命令。
- 自动化编译:只需要make命令,自动根据文件修改时间决定哪些文件需要重新编译,哪些不需要,提高编译效率;
- 管理依赖关系:明确指定源文件、头文件和目标文件之间的依赖关系,确保编译顺序正确;
- 简化编译流程:避免手动输入冗长复杂的编译命令
一个Makefile由多个规则组成,基本格式为:
目标(Target): 依赖(Prerequisites)
命令(Command)目标(Target):通常是要生成的文件(如可执行文件、库文件)或执行的操作(如
clean
)。依赖(Prerequisites):生成目标所需的文件或其他目标。
命令(Command):生成目标需要执行的 shell 命令,必须以 Tab 键 开头。
示例:
# 代表源文件列表
SRC += main.c // +=表示追加变量值
SRC += doulink.c# 可执行文件
DST = app //代表最终你想要生成的可执行文件名,后续运行时输入./app即可
#编译器名称
CC = gcc#调试
FLAG = -g
LIB = -lm#代表引用变量
$(DST):$(SRC)
$(CC) $(SRC) $(FLAG) $(LIB) -o $(DST)//等价于手动执行:gcc main.c doulink.c -g -ln -o app
clean:
rm $(DST)
# --------------------------- # 隐含规则与执行逻辑 # ---------------------------# 当执行 `make` 时,默认执行第一个目标(此处为 $(DST)) # 流程: # 1. 检查是否存在可执行文件 `app` # 2. 检查依赖文件(main.c、doulink.c)的修改时间是否比 `app` 新 # 3. 若文件更新或不存在,执行编译命令重新生成### **关键知识点解析**1. **变量定义**:- **变量名**:习惯用大写字母(如 `SRC`、`DST`),提高可读性。- **赋值符号**:- `=`:延迟赋值(变量值在使用时展开)。- `+=`:追加赋值(等价于 `SRC = $(SRC) main.c`)。- **预定义变量**:- `$(CC)`:默认值为 `cc`,此处显式指定为 `gcc`。- `$(CFLAGS)`:默认用于传递编译选项,此处用 `FLAG` 代替。2. **编译选项**:- `-g`:生成调试信息,允许使用 `gdb` 调试程序。- `-lm`:链接数学库(如 `sqrt()`、`sin()` 等函数需此库)。3. **目标与依赖**:- **目标**:可以是文件或操作(如 `clean`)。- **依赖**:生成目标所需的文件或其他目标(如 `$(SRC)` 是 `$(DST)` 的依赖)。- **命令缩进**:必须使用 **Tab 键** 缩进,不能用空格(否则会报错)。4. **伪目标(Phony)**:- 虽然 `clean` 不生成实际文件,但建议添加
三、 存储结构对比
1. 顺序表(Sequential List)
-
本质:用 连续的内存空间 存储数据元素,逻辑上相邻的元素在物理地址上也相邻。
-
实现方式:通常用 数组 实现,通过数组下标访问元素。
-
例子:C 语言中的数组
int arr[10]
,Java 中的ArrayList
。
2. 链表(Linked List)
-
本质:用 离散的内存节点 存储数据元素,节点通过 指针(或引用) 连接,逻辑上相邻的元素在物理地址上不一定相邻。
-
实现方式:每个节点包含 数据域 和 指针域(指向下一个节点),分为单向链表、双向链表、循环链表等。
-
例子:C 语言中的
struct Node
结构体链表,Java 中的LinkedList
。
特性 | 顺序表 | 链表 |
---|---|---|
内存分配 | 静态分配(编译时确定大小)或动态分配(运行时分配连续空间,如malloc )。 | 动态分配(节点空间单独申请,地址离散)。 |
节点结构 | 元素直接存储在数组中,无额外指针开销。 | 每个节点包含数据域和指针域(单向链表需 1 个指针,双向链表需 2 个指针)。 |
物理地址 | 连续 | 离散 |
逻辑连接 | 通过数组下标隐式表示顺序关系。 | 通过指针显式连接节点。 |
相关文章:
嵌入式学习笔记DAY21(双向链表、Makefile)
一、双向链表 1.概念 双向链表(Doubly Linked List) 是一种链式数据结构,每个节点包含 两个指针(前驱指针 prev 和后继指针 next),分别指向 前一个节点 和 后一个节点,形成双向连接。 头节点&…...
Vue 学习随笔系列二十三 -- el-date-picker 组件
el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...
IEEE出版|连续多年稳定检索|第三届信号处理与智能计算国际学术会议(SPIC2025)
【重要信息】 会议官网: www.ic-spic.com 会议日期:2025年11月28-30日 会议地点:中国 广州 截稿日期:2025年11月10日 接受或拒绝通知日期:提交后7个工作日 【征稿主题】 人工智能和机器学习 计算机系统和架构 …...
用Python代码绘制动态3D爱心效果
引言 介绍Python在创意编程中的应用,特别是如何通过简单的代码实现视觉上的美感。引出本文将分享的爱心代码,并简要说明其实现原理。 爱心代码的基本实现 展示一个简单的Python代码示例,使用字符画的方式在控制台中绘制一个爱心图案。 pr…...
牛客网刷题:NC208813求逆序数
牛客网刷题:NC208813求逆序数 问题描述 在排序和数据结构分析中,逆序数是一个重要的概念。对于一个数列来说,如果一对数的前后位置与大小顺序相反(即前面的数大于后面的数),那么它们就称为一个逆序对。一个…...
Day 21 训练
Day 21 训练 常见的降维算法数据预处理无监督降维PCA(主成分分析)主成分分析(PCA)作用和优势应用场景t-SNE(t-分布随机邻域嵌入)t-SNE(t-分布随机邻域嵌入)为什么 t-SNE 特别适用于高…...
1267, “Illegal mix of collations (latin1_swedish_ci,IMPLICIT
python 执行数据迁移报错 mysql : 1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT 解决方法: 替换TABLE 后面的表名为你自己的表名,mysql 黑窗口执行。 以下是我的表名,仅作参考 ALTER TABLE book CONVERT TO CHARACTE…...
【C#】Thread.Join()、异步等待和直接join
JogThread.Join() 是 .NET 中 System.Threading.Thread 类的一个方法,用来让当前调用线程暂停执行,直到目标线程(这里是 JogThread)终止为止。以下是它的核心语义和你在 UI 代码里需要注意的几个相关知识点。 1. Thread.Join() 的…...
Malformed input or input contains unmappable characters解决
JDK 17 文件上传编码异常解决方案技术文档 1. 问题背景 在 JDK 17 环境下,文件上传过程中可能抛出 Malformed input or input contains unmappable characters 错误。此问题通常由以下原因触发: 文件路径/名称包含非 ASCII 字符(如中文、日…...
PYTHON训练营DAY26
一、函数 (一)不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好!欢迎学习Python函数定义!"print(message)greet()(二&#x…...
奇变偶不变,符号看象限
三角函数诱导公式口诀详解:奇变偶不变,符号看象限 口诀解析 1. 口诀含义 奇变偶不变: 奇/偶:指角度加减的是π/2(90)的奇数倍还是偶数倍 奇数倍(如π/2, 3π/2)→ 函数名改变&…...
基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
Makefile 在 Go 项目中的实践
在 Go 项目中,Makefile 是一个强大的工具,用于自动化构建、测试和部署流程。它不仅能减少重复命令输入,还能确保团队开发环境的一致性。本文以 CoreDNS(一个高性能 DNS 服务器)的 Makefile 为例,解析其设计…...
关闭所有Nginx进程
要关闭所有Nginx进程,可以使用以下命令。这些命令适用于不同的操作系统。 在Linux/Unix系统中 在Linux或Unix系统中,可以使用killall命令来关闭所有Nginx进程。 sudo killall nginx 在Windows系统中 在Windows系统中,可以使用taskkill命…...
开源模型应用落地-模型上下文协议(MCP)-Resources-资源的使用逻辑
一、前言 在大型语言模型与外部世界交互的探索中,如何高效、灵活地接入多样化数据始终是核心命题。MCP(Model Context Protocol)协议中的Resources 机制,正是为这一问题提供了优雅的解决方案。通过URI(统一资源标识符&…...
如何判断一个网站后端是用什么语言写的
判断一个网站的后端是用什么语言写的,可以从以下几个方面入手: 一、通过响应头(HTTP Response Headers) 使用浏览器开发者工具或工具如 curl 查看网站返回的响应头信息,有时可以看到蛛丝马迹: 示例&#…...
CertiK助力以太坊扩展战略,解析Pectra升级的变革与挑战
近期,美国知名金融科技媒体Benzinga发表文章,深入探讨以太坊Pectra升级的变革性影响,并特别引用了CertiK对潜在风险的权威分析,特别是EIP-7702引入的全新信任模型变化。此次升级不仅重新定义了EOA与智能合约的交互方式,…...
【C++】Module CPP:模块化编程 Demo
一、C20 模块简介 C20 模块是 C 语言发展史上的重要革新,它从根本上改变了代码组织方式。相比传统的头文件(#include)机制,模块具有以下核心优势: 隔离编译:模块独立编译,避免重复编译头文件符…...
mvc-service引入
什么是业务层 1)Model1(JSP)和Model2(模糊的mvc): MVC:Model(模型),View(视图),Controller(控制器) 视图层:用于数据展示以及用户交互的界…...
Linux线程互斥锁
1. 什么是互斥锁(Mutex)? 互斥锁(Mutex,Mutual Exclusion) 是一种用于多线程编程的同步机制,用于保护共享资源(如变量、内存、文件等),确保在同一时刻只有一…...
PINN Poisson 1d
📌 一、问题定义 我们要求解的微分方程是 d 2 u d x 2 f ( x ) \begin{equation} \frac{d^2 u}{d x^2} f(x) \end{equation} dx2d2uf(x) 其中: f ( x ) − 0.49 s i n ( 0.7 x ) − 2.25 c o s ( 1.5 x ) f(x) -0.49sin(0.7x) - 2.25cos(1.5x) f(x)−…...
国内优质沉金PCB厂家有哪些?
在高端电子制造领域,沉金工艺因其优异的抗氧化性、信号完整性和焊接可靠性,成为5G通信、AI服务器、新能源汽车等领域的核心需求。本文精选五家国内技术领先的沉金PCB厂家,从工艺精度、交付效率、品质管控等维度展开深度解析,助力企…...
【Trae插件】从0到1,搭建一个能够伪装成网页内容的小说阅读Chrome插件
【Trae插件】从0到1,搭建一个能够伪装成网页内容的小说阅读Chrome插件 最近,Trae 插件也迎来了更新,Trae 插件(原MarsCode 编程助手)Builder模式全面上线,同时支持 VS Code 、JetBrains IDEs,助…...
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式 一、本周热点回顾1. OpenAI发布GPT-5多模态大模型 突破通用智能关键阈值2. 特斯拉Optimus机器人量产版发布 具身智能进入工业场景3. 百度文心ERNIE…...
UDP 多点通信
一、setsockopt/getsockopt 函数详解 1. 函数原型 c #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);…...
什么是TCP协议?它存在哪些安全挑战?
一、TCP协议概述 TCP(传输控制协议)是互联网中面向连接、可靠的传输层协议,主要负责在不可靠的IP层上实现数据的可靠传输。其核心特点包括: 面向连接:通信前需通过三次握手(SYN-SYN/ACK-ACK)建…...
《Python星球日记》 第80天:目标检测(YOLO、Mask R-CNN)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、目标检测简介1. 边界框(Bounding Box)与类别标签2. 两阶段 vs 单阶段检测器两阶段检测器特点:单阶段检测器特点:二、YOLO(You Only Lo…...
工业大数据的定义
目录 工业大数据的定义 工业大数据发展历程 工业大数据的特征 工业大数据的处理流程 工业大数据在处理上面临的挑战 工业大数据的有效处理方案 工业大数据处理相关案例 数益工联 x TDengine 中天钢铁 x TDengine 广州某企业工业互联网项目 x TDengine 格创东智 x TD…...
Cursor vs VS Code vs Zed
代码编辑器的世界已经迎来了创新的爆发。曾经由重量级IDE或基础文本编辑器主导的领域,如今开发者们发现自己正在探索全新一波聚焦于AI集成、协作和性能的工具。 在本文中,我们将深入探讨2025年三款流行的编辑器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…...
道通龙鱼系列-混合翼无人机:垂直起降+长时续航
道通龙鱼系列-混合翼无人机:垂直起降长时续航 道通龙鱼系列无人机采用独特的倾转翼尖设计,有效融合多旋翼垂直起降和固定翼长时续航的双重优势,机动、灵活,适应各种复杂起降条件;整机采用快拆和高效气动设计࿰…...
单片机-STM32部分:17、数码管
飞书文档https://x509p6c8to.feishu.cn/wiki/TOQqweKHWinugokUyqzcwb0fnTd 原理: 一个二极管等于八个LED组合在一起,想要显示什么形状,就点亮对应LED即可。 数码管根据其公共端所接的阳极和阴极的不同,分为了共阴极数码管和共阳…...
Web安全科普:构建数字世界的“防盗门”
目录 一、Web安全的核心挑战 二、六大核心威胁深度解析 三、安全防御体系构建 四、开发者必备工具包 五、法律合规要点 六、未来安全趋势 一、Web安全的核心挑战 1. 攻击者视角的入口 数据流动路径:用户 → 浏览器 → 网络 → 服务器 → 数据库 脆弱点分布&a…...
深入解析HTTP协议演进:从1.0到3.0的全面对比
HTTP协议作为互联网的基础协议,经历了多个版本的迭代演进。本文将详细解析HTTP 1.0、HTTP 1.1、HTTP/2和HTTP/3的核心特性与区别,帮助开发者深入理解网络协议的发展脉络。 一、HTTP 1.0:互联网的奠基者 核心特点: 短连接模式&am…...
【RAP】RAP动作与流行舞蹈/街舞
RAP动作与流行舞蹈风格的匹配性分析 Rap动作与各种流行舞蹈风格的匹配度如下: 最匹配 街舞(Hip-hop/Street Dance) 完美匹配程度:★★★★★原因:Rap和街舞同源于嘻哈文化,共享相同的文化根基特点:街舞的断点式动作、力量感和即兴性与Rap的节奏完美契合代表动作:Break…...
BUUCTF——web刷题第一页题解
共31题,admin那题没有,因为环境问题,我做的非常卡 目录 极客大挑战 2019]Havefun [HCTF 2018]WarmU [ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec [GXYCTF2019]Ping Ping Ping [SUCTF 2019]EasySQL [极客大挑战 2019]LoveSQL [极…...
windows、Ubuntu、Debian 添加静态路由
1. windows 10 添加静态路由 快捷键win R: 输入 cmd ,打开命令行窗口 route print // 查看已经存在的路由 route add 192.168.3.0 mask 255.255.255.0 192.168.3.200 // 添加静态路由 192.168.3.200 为下一跳 route add -p 192.168.…...
服务器连接多客户端
一、epoll 核心函数详解 1. epoll_create/epoll_create1 - 创建 epoll 实例 c #include <sys/epoll.h> int epoll_create(int size); // Linux 2.6.8前需指定size(>1),后续版本可忽略 int epoll_create1(int flags); // 推荐使用…...
驿客时光影院酒店升级:雷克赛恩 Cyber Pro 1 如何重塑住宿观影体验
一、影院式酒店新趋势:当住宿邂逅沉浸式观影体验 (一)驿客时光的差异化突围 成都温江区的驿客时光影院酒店,凭借 “百寸巨幕观影 舒适住宿” 的差异化定位,成为年轻旅客打卡热点。其 20 间主题客房均配备独立投影设…...
Cinema4D 26.014
添加图片注释,不超过 140 字(可选) 软件概述 Cinema 4D是德国MAXON公司开发的一款专业的3D动画、建模、仿真和渲染软件解决方案,在3D设计领域应用广泛。 功能特点 强大的建模功能 多边形建模:提供了丰富的多边形建模…...
脚本语言Lua
本文来源 :腾讯元宝 Lua是一种轻量级、可嵌入的脚本语言,由巴西里约热内卢天主教大学的Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开发。其设计目标是嵌入应用程序中,提供灵活的扩展和定制功能。 主要特性…...
106. 从中序与后序遍历序列构造二叉树
https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envTypestudy-plan-v2&envIdtop-interview-150思路:我们知道后序的顺序是左右根,所以后序数组的最后一个一定是根节点,然后中序…...
全链路压测实战指南:从理论到高可用架构的终极验证
全链路压测实战指南:从理论到高可用架构的终极验证 引言:你的系统,真的准备好迎接洪峰了吗? 凌晨3点,某大型电商平台秒杀活动突袭上线。百万用户同时涌入,订单接口响应时间从200ms飙升到15秒,数据库连接池被瞬间耗尽,支付服务直接“熔断”,连锁反应导致库存混乱、物流…...
分布式AI推理的成功之道
随着AI模型逐渐成为企业运营的核心支柱,实时推理已成为推动这一转型的关键引擎。市场对即时、可决策的AI洞察需求激增,而AI代理——正迅速成为推理技术的前沿——即将迎来爆发式普及。德勤预测,到2027年,超半数采用生成式AI的企业…...
纯前端实现基于位置的天气和动态背景图片
如何为博客首页实现基于位置的天气和动态背景图片 引言 我为我的博客主页添加了根据用户所在位置显示当地天气、日出日落时间,并加载一张与天气和时间段匹配的高质量背景图片,可以显著提升用户体验。想象晴天时展示阳光普照的田野,雨天时呈现…...
1.1 认识编程与C++
认识编程与C教程 目标 理解程序、指令、数据的概念。了解C在现实中的应用场景。学会搭建编程环境,迈出第一步。 一、编程是什么?——给计算机写“魔法指令” 1. 基本概念 程序:一系列指令的集合,像一本“魔法食谱”。 &#x…...
代码随想录算法训练营第60期第三十七天打卡
大家好,今天我们算法训练营的第37天,首先为自己感到骄傲,居然坚持下来了,本来觉得自己可能坚持不下来,但是我硬是坚持下来了,好样的,同时也感谢那些看我的题解给我点赞的朋友,我在这…...
每周靶点:TIGIT、ICAM1及文献分享
本期精选了《抑制性受体TIGIT》《细胞粘附分子ICAM1》《真核蛋白表达:选择合适的条件进行》《文献分享:双特异性和多特异性抗体的可开发性评估》四篇文章。以下为各研究内容的概述: 抑制性受体TIGIT TIGIT是一种具有Ig和ITIM结构域的T细胞免…...
介绍一下什么是 AI、 AGI、 ASI
1. AI(人工智能):工具化的“窄域智能” 定义: AI 是能够执行特定任务的智能系统,依赖大量数据和预设规则,缺乏自主意识和跨领域通用性。 特点: 任务专用:如图像识…...
部署安装jenkins.war(2.508)
实验目的:部署jenkins,并与gitlab关联bulid 所需软件:jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机:8.10具有java环境,内存最少为4G,cpu双核 目录 jdk安装 …...
【歌曲结构】2:小节与歌曲结构信息整合
歌曲小节与结构信息整合 我将为您整合小节信息与歌曲结构,创建一个更加详细的JSON数据结构。 处理方法 将小节时间与歌曲结构段落进行匹配为每个小节添加所属段落信息为小节添加格式化的时间戳为小节添加对应时间范围内的歌词{"song_title": "财神庙前许三亿…...