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

数据结构_单链表

在这里插入图片描述

今天我们要开启链表的学习

🖋️🖋️🖋️
学了顺序表我们可以知道:
🎈链表其实就是争对顺序表的缺点来设计的,补足的就是顺序表的缺点
🎈链表在物理上是上一个节点存放的下一个节点的地址

链表

1.链表的概念及结构

1.1概念

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

1.2结构
在这里插入图片描述
根据上图我们可以知道:
链表是由一系列节点组成的线性数据结构,每个节点包含数据部分和指向下一个节点的指针(在双向链表中还有指向前一个节点的指针)。节点通过指针连接在一起,形成一个链式结构,数据在内存中存储并不连续。

2.链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:
1.单向、双向
2.带头、不带头
3.循环、非循环
(这里图就不展示啦,大家感兴趣的可以自己去查找噢)

3.链表的实现

1.创建一个节点

typedef int SListDataType;
//节点
typedef struct SListNode
{//定义一个数据SListDataType data;//这个data就是下图中的1 2 3//定义一个指针struct SListNode* next;//next就是存放的指针
}SListNode;

这部分代码定义了一个单链表的节点结构:

  • struct SListNode:定义了一个名为 SListNode 的结构体,用于表示单链表中的一个节点。
  • SListDataType data;:在结构体中定义了一个成员变量 data,其数据类型为之前定义的 SListDataType(这里实际上就是 int 类型)。这个成员变量用于存储链表节点所包含的数据。
  • struct SListNode* next;:定义了一个指向struct SListNode类型的指针 next。这个指针用于指向下一个链表节点,通过它可以将多个节点连接起来形成链表。

2.遍历打印链表

void SListPrint(SListNode* phead)
{//这里不需要assert断言,因为这里为空的话就是空链表SListNode* cur = phead;//指向第一个节点while (cur != NULL){printf("%d ", cur->data);cur = cur->next; }
}

画图解释:
在这里插入图片描述

3.尾插

//动态申请新节点并初始化
SListNode* BuySListNode(SListDataType x)
{SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));//在内存的堆区动态分配一块连续的内存空间,大小为 SListNode 结构体的字节数,再强转为SListNode*型if (newNode == NULL){printf("申请结点失败\n");exit(-1);}newNode->data = x;//将传入的数据 x 存储到新节点的 data 成员newNode->next = NULL;//初始化新节点的 next 指针为 NULL(新节点暂时无后续节点)return newNode;//返回创建好的节点地址
}//尾插
void SListPushBack(SListNode** pphead, SListDataType x)
{SListNode* newNode = BuySListNode(x);//调用函数创建待插入的新节点if (*pphead == NULL){*pphead = newNode;//若链表为空,直接让头指针指向新节点}else{//找尾SListNode* tail = *pphead;//定义指针 tail 指向链表头部while (tail->next != NULL)//遍历链表,找到尾节点(尾节点的 next 为 NULL){tail = tail->next;//实现遍历链表的关键代码,将指针 tail 移动到下一个节点}tail->next = newNode;//将尾节点的 next 指针指向新节点,完成尾插}}

问题:动态申请return newNode;为什么要返回创建好的节点地址

返回新节点的地址是为了让调用者能够:

  1. 节点插入链表中。
  2. 后续操作节点的数据或指针。
  3. 正确释放内存(避免泄漏)。

这是 C 语言中动态内存管理的标准做法,确保函数间的数据传递和内存控制权的转移。

4.尾删

//尾删
void SListPopBack(SListNode** pphead)
{//1.空//2.一个结点//3.一个以上结点// 处理空链表if (*pphead == NULL){return;//直接返回,没得删}// 处理单节点链表else if ((*pphead)->next ==NULL){free(*pphead);*pphead = NULL;//只有这一个就直接删}// 处理多节点链表else{SListNode* prev = NULL;//用于记录尾节点的前驱节点SListNode* tail = *pphead;//用于遍历链表while (tail->next  != NULL){prev = tail;//在循环中,prev 始终指向 tail 的前一个节点,tail 逐步后移tail = tail->next;//再往后走}free(tail);tail = NULL;prev->next = NULL;//将其存放的地址置空,避免内存泄漏和悬空指针}
}

5.头插

//头插
void SListPushFront(SListNode** pphead, SListDataType x)
{SListNode* newnode = BuySListNode(x);//创建新节点newnode->next = *pphead;//新节点的 next 指向原头节点*pphead = newnode;//更新头指针为新节点
}

步骤分析:

  • 步骤 1:创建新节点
    调用 BuySListNode(x)
    动态分配内存,初始化data xnext NULL
  • 步骤 2:连接新节点与原头节点
    newnode->next = *pphead;
    若原链表非空,新节点的next指向原头节点(形成链式关系)。
    若原链表为(*pphead == NULL),新节点的next仍为 NULL
  • 步骤 3:更新头指针
    *pphead = newnode;
    将头指针pphead指向新节点,使其成为链表的新头部。

画图解释:
在这里插入图片描述
注意:

  1. 核心原因:头指针是链表的入口,必须指向第一个节点。头插法中,新节点成为第一个节点,因此必须更新头指针。
  2. 技术实现:通过双重指针修改原始头指针,确保链表结构正确。若省略此步骤,新节点将无法被链表访问,导致内存泄漏或逻辑错误。

6.头删

//头删
void SListPopFront(SListNode** pphead)
{//1.空//2.一个节点 + 3.一个以上节点if (*pphead == NULL){return;}else{SListNode* next = (*pphead)->next;//保存头节点的下一个节点 free(*pphead);// 释放头节点内存*pphead = next;// 更新头指针为原头节点的下一个节点  }
}

详细分析:

  • 保存后续节点:SListNode* next = (*pphead)->next; 记录原头节点下一个节点,防止链表断裂。
  • 释放内存:free(*pphead); 释放原头节点的内存,避免内存泄漏。
  • 更新头指针:*pphead = next; 使头指针指向原头节点的下一个节点,完成头删。

举个例子:
在这里插入图片描述
注意

  1. 左边 next:是程序员自定义的指针变量,用于临时存储地址。
  2. 右边 next:是链表节点结构体固有的成员,用于维系链表的链式结构。

二者仅名称相同,但一个是变量标识,一个是结构体成员,功能和性质完全不同。

7.单链表查找

// 单链表查找
SListNode* SListFind(SListNode* phead, SListDataType x)
{SListNode* cur = phead;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}

详细分析:

  • SListNode* cur = phead;定义一个指针cur并初始化为 phead,用于遍历单链表。cur 会从链表的头节点开始,依次向后移动;
  • 在循环内部,使用if语句检查当前节点cur的数据域data是否等于要查找的值 x。如果相等,则表示找到了目标节点,直接返回 cur,即该节点的指针
  • cur = cur->next;如果当前节点的数据域不等于 x,则将cur指针更新为指向下一个节点,继续向后遍历链表。
  • return NULL;如果while循环结束后仍未找到值为x的节点,说明链表中不存在该值,此时返回 NULL

在test函数中实现时:

在这里插入图片描述

最后的打印结果为:
(将3修改为了30)
在这里插入图片描述

8.单链表在pos位置之插入x

void SListInsertAfter(SListNode* pos, SListDataType x)
{assert(pos);SListNode* newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;
}

问题:分析思考为什么不在pos位置之前插入?

原因:单链表的单向性决定了插入操作必须依赖前驱节点的遍历,若pos无法通过遍历到达(如越界或无前驱),则无法实现插入。

实例:若链表为1→2→3,想在节点2前插入0,需先找到节点1(前驱),再修改其指针为1→0→2→3。若无法找到前驱(如pos为4),则插入失败。

关键指针操作分析

  • newnode->next = pos->next;
    pos->next pos节点原本指向的下一个节点的指针。
    这行代码的作用是让新节点newnodenext指针指向pos节点原来的下一个节点。其目的是在插入新节点时,保证新节点能够连接到原链表中pos节点之后的部分,避免丢失后续的节点。可以把它理解为 “记住”pos节点后面的节点,以便后续正确连接链表。
  • pos->next = newnode;
    这行代码将pos节点的next指针指向新节点 newnode
    结合上一步,这就完成了将新节点插入到 pos 节点之后的操作。此时,pos 节点后面跟着新节点 newnode,而新节点 newnode 后面接着原链表中 pos 节点原本的后续节点,链表结构更新成功。

画图分析:
在这里插入图片描述

9.单链表删除pos位置之的值

// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos)
{assert(pos);if (pos->next)//不为空{SListNode* next = pos->next;SListNode* nextnext =next->next;pos->next = nextnext;free(next);}
}

分析思考为什么不删除pos位置?

原因:在单链表中,直接删除pos位置节点需要遍历链表来寻找前驱节点,这会增加代码的复杂度和时间成本。因此,通常建议优先采用删除后继节点或者复制后继节点值的替代方案。如果确实需要删除pos节点,就必须传递头指针的地址(即二级指针),以便在头节点被删除时能够正确更新链表的头指针。

画图分析:
在这里插入图片描述
详细分析:
🖋️🖋️🖋️
pos->next也就是方框1的后半个位置,存放的是next的地址;通过next指向的next也就是第二个next的后半个方框,存放的是第三个nextnext的地址;所以删除后直接将nextnext所存放的地址赋值给pos->next!

如何去调用呢?

在这里插入图片描述

10.接口实现

在这里插入图片描述
🎉🎉🎉
到这里本章就结束啦~
我们下节见~

相关文章:

数据结构_单链表

今天我们要开启链表的学习 🖋️🖋️🖋️ 学了顺序表我们可以知道: 🎈链表其实就是争对顺序表的缺点来设计的,补足的就是顺序表的缺点 🎈链表在物理上是上一个节点存放的下一个节点的地址 链表 …...

b站视频下载工具软件怎么下载

自行配置FFMPEG环境 请优先选择批量下载,会自处理视频和音频文件。 如果要下载更高质量请登陆。 没有配置FFMPEG下载后会有报错提示,视频音频文件无法合并生成mp4文件 更新批量下载标题,只取视频原标题,B站反爬机制登陆后下载多了…...

如何实现pinia的持久化存储

在 Vue 3 项目中使用 Pinia 进行状态管理时,若要实现持久化存储,可借助 pinia-plugin-persistedstate 插件,该插件能让 Pinia 存储的状态在页面刷新或关闭后依然保留。下面为你详细介绍实现步骤: 1. 安装插件 首先,在…...

webpack介绍

entry与output 入口是 Webpack 开始构建依赖图的起点,Webpack 会从入口文件开始,递归地分析项目的依赖图。输出指定 Webpack 打包后的文件存放位置和文件名。 const path require("path");module.exports {entry: "./src/index.js&qu…...

使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图

以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图: graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …...

蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言:STM32G431RBT6实现嵌入式组第七届题目解析源码&…...

【spring bean的生命周期】

以下是使用 Mermaid 绘制的 Spring Bean 生命周期流程图: 流程说明 实例化:Spring 容器创建 Bean 的实例。属性赋值:Spring 为 Bean 的属性注入值(依赖注入)。BeanPostProcessor.postProcessBeforeInitialization&…...

数据类设计_图片类设计之3_半规则图类设计(前端架构基础)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇讨论半规则图类型的设计 半规则图的定义 什么是半规则图?笔者看见了一些似乎规则又不是太规则的图形,例如带圆角的矩阵,在页面上找一个圆角框 为了…...

【leetcode hot 100 138】随机链表的复制

解决一:回溯 哈希表 本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建&#xf…...

如何安全处置旧设备?

每年,数百万台旧设备因老化、故障或被新产品取代而被丢弃,这些设备上存储的数据可能带来安全风险。 如果设备没有被正确删除数据,这些数据往往仍可被恢复。因此,安全处置旧设备至关重要。 旧设备可能包含的敏感数据 旧设备中可能…...

Windows 万兴恢复专家 Wondershare Recoverit-v13.5.7.9-[电脑数据恢复工具]

Windows 万兴恢复专家Wondershare_Recoverit 链接:https://pan.xunlei.com/s/VOL3z608vzAj_IYTvH-F1q7kA1?pwdiu89# 1. 打开Setup.exe进行安装,安装完不要打开软件,记住安装目录 2. 将"Crack"文件夹内的所有文件复制到安装目录 …...

eLection: 1靶场渗透测试

eLection: 1 来自 <eLection: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.196 3&#xff0c;对靶机进行端口服…...

类与对象(下)

1 . 再谈构造函数 1.1构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class B { public:B(int a0){_a a;} private:int _a; };虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xf…...

数字人源头技术搭建模型--v10追踪推理逻辑

数字人源头技术搭建模型--v10追踪推理逻辑 #数字人# #数字人技术源头saas开发# 数字人源头技术搭建模型V10的追踪推理逻辑通常涉及以下几个关键方面&#xff1a; 数据收集与预处理 - 多模态数据采集&#xff1a;收集图像、音频等多模态数据。例如通过摄像头采集人物的面部…...

基于Asp.net的高校迎新管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

商业智能BI的未来,如何看待AI+BI这种模式?

昨天在和一位朋友线上聊天的时候&#xff0c;提了一个问题&#xff0c;你是如何看待AI&#xff08;人工智能&#xff09;BI&#xff08;商业智能&#xff09;这种模式和方向的&#xff0c;我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业&#xff0c;…...

C++ 编程指南27 - 始终将 mutex 与它所保护的数据一起定义,并尽可能使用 synchronized_value<T>

一&#xff1a;概述 在多线程编程中&#xff0c;互斥锁&#xff08;std::mutex&#xff09;的作用是保护共享数据的访问。但如果 mutex 和它保护的数据分开定义&#xff0c;可能会导致以下问题&#xff1a; 锁的使用不明显&#xff1a;程序员可能会忘记获取 mutex 就访问数据&…...

选择 DotNetBrowser 还是 EO.WebBrowser

您是否正在为 .NET 应用寻找 Web 视图控件&#xff1f;如果是的话&#xff0c;那您真是太幸运了&#xff01;.NET 生态系统提供了丰富的选择。既有开源和专有的免费 Web 视图控件&#xff0c;也有许多企业广泛选择的商业 Web 视图控件。 在这篇博客文章中&#xff0c;我们将对…...

ngin配置内网服务-具体案例【天地图】

ngin配置内网服务-具体案例【天地图】 描述需求整体网络架构1. 政务内网服务器&#xff08;10.10.10.70&#xff09;2. 网闸&#xff08;10.10.10.240:8088&#xff09;3. 跳板机&#xff08;10.10.20.70:9109&#xff09;4. 天地图服务 具体步骤第一步&#xff1a;配置跳板机&…...

【网络】poll 与epoll(原理、工作模式LT、ET)

文章目录 1. poll2. epoll3. epoll原理4. epoll工作模式4.1 水平模式LT4.2 边缘模式ET 在前面用的select中&#xff0c;它的使用方式非常麻烦&#xff0c;而且能支持的文件描诉符太少了。 下面来介绍一下更加方便、高效的方式: 1. poll poll函数接口&#xff1a; include <…...

DeepIn Wps 字体缺失问题

系统缺失字体 Symbol 、Wingdings 、Wingdings2、Wingdings3、MT—extra 字体问题 问了下DeepSeek 在应用商店安装或者在windows 里面找 装了一个GB-18030 还是不行 在windows里面复制了缺失的字体 将字体复制到DeepIn 的字体目录&#xff08;Ubuntu 应该也是这个目录&am…...

Spring有哪些缺点?

大家好&#xff0c;我是锋哥。今天分享关于【Spring有哪些缺点?】面试题。希望对大家有帮助&#xff1b; Spring有哪些缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring是一个非常流行的Java框架&#xff0c;提供了丰富的功能和灵活的配置选项&#xf…...

使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile

比起容器、镜像来说&#xff0c;Dockerfile 非常普通&#xff0c;它就是一个纯文本&#xff0c;里面记录了一系列的构建指令&#xff0c;比如选择基础镜像、拷贝文件、运行脚本等等&#xff0c;每个指令都会生成一个 Layer&#xff0c;而 Docker 顺序执行这个文件里的所有步骤&…...

蓝桥杯刷题周计划(第二周)

目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…...

03 | fastgo 项目规范及目录结构介绍

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入我的训练营&#xff1a;云原生AI实战营&#xff0c;一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营。 为了让你更好的学习本课程。本节课&#xff0c;我来简单介绍下 fastgo…...

K8S学习之基础二十三:k8s的持久化存储之nfs

K8S持久化存储之nfs ​ 在 Kubernetes (k8s) 中使用 NFS&#xff08;Network File System&#xff09;作为存储解决方案是一种常见的方式&#xff0c;特别是在需要共享存储的场景中。以下是关于如何在 Kubernetes 中使用 NFS 存储的详细说明&#xff1a; 1. 准备 NFS 服务器 …...

CTF代码学习日记 Python

os模块 在Python中&#xff0c;os是一个内置的标准模块&#xff0c;主要用于与操作系统进行交互&#xff0c;提供了许多操作文件、目录、进程等的功能。 例如&#xff1a; os.mkdir()用于创建新目录os.rmdir()用于删除空目录os.listdir()可以列出指定目录下的所有文件和目录…...

存储优化(protobuf与mmkv)

存储优化&#xff08;protobuf与mmkv&#xff09; 在Android应用开发中&#xff0c;数据存储是一个基础且关键的环节。随着应用功能的日益复杂&#xff0c;数据量的增加&#xff0c;传统的存储方式如SharedPreferences、SQLite等在性能上的局限性逐渐显现。本文将深入探讨两种…...

MTK Android12 添加GMS后,报“设备未经过play保护认证“问题

文章目录 问题解决 问题 在MTK平台的Android12机柜上面&#xff0c;客户要求安装GMS。安装后&#xff0c;打开发现报"设备未经过play保护认证"问题&#xff0c;无法使用。解决 路径&#xff1a;/build/make/tools/buildinfo.sh diff --git a/build/make/tools/bui…...

自定义Linux网络协议的开发与测试

在当今快速发展的技术领域中,定制化网络协议可以为特定的应用场景提供灵活而强大的解决方案。本文将详细介绍如何在Linux系统上开发一个自定义网络协议,并编写相应的用户空间程序进行测试。所有步骤基于2025年3月11日的时间点完成。 开发自定义协议内核模块 定义协议和实现…...

Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南

&#x1f4cc; 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器&#xff0c;可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…...

说一下spring的事务隔离级别?

大家好&#xff0c;我是锋哥。今天分享关于【说一下spring的事务隔离级别&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说一下spring的事务隔离级别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring的事务隔离级别是指在数据库事务管理中…...

【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用

深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识&#xff0c;都会有新的领悟。大约 2 年前&#xff0c;我曾就这一技术方向撰写过另一篇短文《从类型转换视角&#xff0c;浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…...

C++ Primer Plus第十二章课后习题总结

1. 对于下面的类声明&#xff1a; class Cow {char name[20];char * hobby;double weight;public:Cow();Cow(const char * nm, const char * ho, double wt);Cow(const Cow c&);~Cow();Cow & operator(const Cow & c);void ShowCow() const; // display all cow d…...

Xavier 初始化:深度网络权重初始化的经典之作

Xavier 初始化&#xff1a;深度网络权重初始化的经典之作 发音&#xff1a;美 [zeɪvjər] n.泽维尔&#xff08;男子名&#xff09; 在深度学习的发展历程中&#xff0c;权重初始化对神经网络训练的成功至关重要。随机初始化的简单方法在浅层网络中尚可&#xff0c;但在深层…...

【量化策略】动量反转策略

【量化策略】动量反转策略 &#x1f680;量化软件开通 &#x1f680;量化实战教程 技术背景与应用场景 动量反转策略是一种基于市场行为分析的量化交易策略&#xff0c;它假设股票价格在经历一段时间的持续上涨或下跌后&#xff0c;会出现反转。这种策略适用于那些希望通过…...

菜鸟之路Day23一一JavaScript 入门

菜鸟之路Day23一一JavaScript 入门 作者&#xff1a;blue 时间&#xff1a;2025.3.10 文章目录 菜鸟之路Day23一一JavaScript 入门0.概述1.JS的引入方式2.JS的基础语法2.1输出语句2.2变量2.3数据类型2.4运算符2.5类型转换 3.函数4.JS对象4.1Array对象4.2String对象4.3Js自定义…...

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求 0、界面预览00、简介1、编译安装1.1 编辑模块配置文件 2、使用2.1 拨号规则GET 请求POST 请求JSON 数据 2.2 Lua 脚本GET 请求POST 请求JSON 数据 3 、示例3.1 示例 1&#xff1a;提交 CDR 到第三方接口3.2 示例 2…...

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...

HTTP与HTTPS的深度解析:技术差异、安全机制及应用场景

引言 HTTP&#xff08;超文本传输协议&#xff09;作为互联网通信的核心协议&#xff0c;自1991年诞生以来&#xff0c;经历了从HTTP/1.0到HTTP/3的多次迭代。然而&#xff0c;随着网络安全威胁的升级&#xff0c;纯HTTP协议因缺乏加密机制逐渐暴露其局限性。本文将重点解析HT…...

DrissionPage:更高效的动态爬虫实践(实例)

场景分析 代码重构对比 原Requests方案痛点 DrissionPage方案优势 重构后完整代码 关键技术点解析 1. 会话保持与指纹模拟 2. 智能请求重试 3. 反反爬策略 4. 混合模式扩展 性能对比测试 适用场景建议 常见问题解决 场景分析 原代码通过Requests直接调用B站API接…...

Triplet Loss原理及 Python实现

Triplet loss最初是谷歌在 FaceNet: A Unified Embedding for Face Recognition and Clustering 论文中提出的&#xff0c;可以学到较好的人脸的embedding Triplet Loss 是一种用于训练特征嵌入&#xff08;feature embedding&#xff09;的损失函数&#xff0c;广泛应用于人脸…...

2025人工智能AI新突破:PINN内嵌物理神经网络火了

最近在淘金的时候发现基于物理信息的神经网络&#xff08;简称PINN&#xff09;也是个研究热点&#xff0c;遂研读了几篇经典论文&#xff0c;深觉这也是个好发论文的方向&#xff0c;所以火速整理了一些个人认为很值得一读的PINN论文和同学们分享。 为了方面同学们更好地理解…...

深入探索Matter协议:开发Matter智能家居设备的基本步骤

随着家居智能化程度的提高&#xff0c;智能家居设备之间相互连接的网络虽然提升了家庭便利性&#xff0c;但也变得越来越复杂&#xff0c;难以管理。将亚马逊Alexa、Ring门铃、谷歌Nest Hub和苹果HomeKit等各种设备连接起来&#xff0c;并确保这些不同设备和操作系统能够良好地…...

搜广推校招面经四十五

快手主站推荐算法 这个是做因果选券的&#xff0c;如果大家的工作和这个有关&#xff0c;可以看看 一、有没有分析特征对各个的贡献度&#xff0c;怎么做&#xff1f; 传统的特征重要度衡量方法&#xff0c;就不介绍了。什么基于树模型的、SHAP值、LIME等。 但其实实际工程中…...

python之replace,strip,split命令

1. replace() 方法 功能&#xff1a;替换字符串中的指定子串 语法&#xff1a;str.replace(old, new[, count]) 特点&#xff1a; 全部替换&#xff08;默认&#xff09;或指定替换次数区分大小写返回新字符串&#xff0c;原字符串不变 示例&#xff1a; text "Hello…...

C语言处理字符串的十个函数(附带大量实例)

C语言的字符串处理函数主要集中在 <string.h> 头文件中&#xff0c;使用这些函数前必须包含该头文件。 字符串处理函数操作的对象通常是字符串&#xff08;以 \0 结尾的字符数组&#xff09;&#xff0c;它们极大地方便了文本处理任务。 以下是我们将要讲解的主要函数&…...

【10】单片机编程核心技巧:指令周期与晶振频率

【10】单片机编程核心技巧&#xff1a;指令周期与晶振频率 &#x1f31f; 核心概念 单片机的运算速度与时间控制&#xff0c;本质上由 指令周期 和 晶振频率 共同决定。理解这两者的关系&#xff0c;是掌握单片机底层控制的关键。 &#x1f4cc; 1. 节拍与指令周期 &#x1…...

GitLab的Dockerfile 追踪

为了在 GitLab 上准备每个平台的 Docker 镜像文件&#xff0c;并实现完整的 Dockerfile 追踪&#xff0c;可以按照以下步骤进行操作&#xff1a; 项目准备 首先&#xff0c;确保你有一个 GitLab 项目&#xff0c;并且本地已经克隆了该项目的仓库。如果还没有项目&#xff0c;可…...

HTML基础

前言 什么是 HTML&#xff1f; HTML 是一种用于创建网页结构的标记语言&#xff0c;通过标签&#xff08;Tag&#xff09;定义内容的结构和呈现方式。 浏览器解析 HTML 文档后&#xff0c;将其渲染为可视化网页。 一、HTML 语法 1. HTML 基本骨架 所有 HTML 文档必须包含以下…...