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

数据结构day3

一、gdb调试


gcc -g main.c linklist.c    //  对两个.c文件进行编译,生成 a.out 文件 

gdb a.out                         //调试可执行文件 a.out

b linklist.c:36             // 在该.c文件第 36 行设置断点

r                                //  运行程序,但会在断点前停下

n                               //执行下一步

s                               //若遇到函数调用,可通过s进入该函数调用内部执行过程

p  len                        //显示变量值

q                                //退出调试

     

二.单链表的基本操作

linklist.h文件        主要是包含数据和函数声明

#ifndef _LINKLIST_H_      //linklist.h文件,主要包含 数据 和 函数的声明
#define _LINKLIST_H_
typedef struct     //链表中数据 的 抽象数据类型
{char name[10];char sex;int age;int score;
}DATATYPE;typedef struct _node_   //链表结点声明
{ DATATYPE data;struct _node_ * next;
}LinkNode;typedef struct     
{LinkNode * head;  //链表头指针int clen          //链表长度   
}LinkList;extern LinkList*CreateLinkList();  //创建链表
extern int InsertHeadLinkList(LinkList*ll,DATATYPE*data);//链表头插
extern int InsertTailLinkList(LinkList*ll,DATATYPE*data);//链表尾插
extern int InsertPosLinkList(LinkList*ll,DATATYPE*data,int pos);//链表指定位置插,从0开始extern int IsEmptyLinkList(LinkList*ll); //链表判空
extern int GetSizeLinkList(LinkList*ll); //获取链表长度
extern int ShowLinkList(LinkList*ll);    //打印链表数据
extern DATATYPE* FindLinkList(LinkList*ll,char*name);//根据名字找链表中的数据
extern int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data); //修改链表数据
extern int DeleteLinkList(LinkList*ll,char*name);  //删除链表节点
extern int DestroyLinkList(LinkList**ll);   //销毁链表extern LinkNode* FindMidLinkList(LinkList*ll);      //找中间结点
extern LinkNode* FindLastKLinkList(LinkList*ll,int k);   //找倒数第k个结点
extern int RevertLinkList(LinkList*ll);             //反转结点
extern int InsertSortLinkList(LinkList*ll);         //用插入排序,依据成绩对链表排序
#endif

linklist.c文件        主要是包含函数的定义

#include "linklist.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>LinkList* CreateLinkList()           //初始化创建链表
{LinkList* ll = malloc(sizeof(LinkList));   //为包含头指针的数据结构申请空间if (NULL == ll)                            //如果申请失败则,报错并退出{fprintf(stderr, "CreateLinkList malloc");return NULL;}ll->head = NULL;    //初始指向空ll->clen = 0;        //长度初始为0return ll;
}int IsEmptyLinkList(LinkList* ll)  //对链表判空
{ return 0 == ll->clen; 
}int InsertHeadLinkList(LinkList* ll, DATATYPE* data) //对链表头插
{LinkNode* newnode = malloc(sizeof(LinkNode));   //申请一个待插入结点空间,if (NULL == newnode)                            //判断是否申请成功{fprintf(stderr, "InsertHeadLinkList malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));   //将数据拷贝到 新申请结点的数据域中newnode->next = NULL;                         //新结点指针域设置为NULLif (IsEmptyLinkList(ll))         //如果链表为空{ll->head = newnode;         //直接让头指针指向新结点}else{newnode->next = ll->head;    //否则,新结点指向,头指针指向的下一个结点ll->head = newnode;          //   头指针指向新结点}ll->clen++;                      //结点数量+1return 0;
}int GetSizeLinkList(LinkList* ll)   //获得结点长度
{ return ll->clen; 
}int ShowLinkList(LinkList* ll)   //打印结点
{int len = GetSizeLinkList(ll);LinkNode* tmp = ll->head;int i = 0;for (i = 0; i < len; ++i){printf("%s %c %d %d\n", tmp->data.name, tmp->data.sex, tmp->data.age,tmp->data.socre);tmp = tmp->next;}return 0;
}DATATYPE* FindLinkList(LinkList* ll, char* name)   //根据name找结点
{LinkNode* tmp = ll->head;while (tmp)                  //当结点为NULL时,while循环退出{if (0 == strcmp(tmp->data.name, name))   //如果相等,则返回该结点数据域,并退出{return &tmp->data;}tmp = tmp->next;    //不相等,则指向下一个结点}return NULL;   //如果没找到返回NULL
}int DeleteLinkList(LinkList* ll, char* name)    //根据数据域中的名字,删除结点
{LinkNode* tmp = ll->head;if (IsEmptyLinkList(ll))  //如果链表为空,直接返回1{return 1;}if (0 == strcmp(tmp->data.name, name))  //如果第一个就是{ll->head = ll->head->next;  free(tmp);    //释放结点ll->clen--;return 0;}while (tmp->next)   //当下一个节点为空时退出,因此上面把第一个结点单独拿出来写{if (0 == strcmp(tmp->next->data.name, name)){LinkNode* tmp2 = tmp->next;tmp->next = tmp->next->next;free(tmp2);ll->clen--;return 0; //找到返回0}tmp = tmp->next;}return 1;  //未找到返回1
}int InsertTailLinkList(LinkList* ll, DATATYPE* data)   //尾插,与头插类似
{if (IsEmptyLinkList(ll))  //链表如果为空{return InsertHeadLinkList(ll, data); //直接调头插}else{LinkNode* newnode = malloc(sizeof(LinkNode));if (NULL == newnode){fprintf(stderr, "InsertTailLinkList malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;LinkNode* tmp = ll->head;while (tmp->next){tmp = tmp->next;  // tmp++;}tmp->next = newnode;ll->clen++;}return 0;
}int InsertPosLinkList(LinkList* ll, DATATYPE* data, int pos)  //指定位置插入数据
{int len = GetSizeLinkList(ll); //得到链表长度if (pos < 0 || pos > len)  //如果插入位置不在该区间内,直接返回1,说明错误{return 1;}if (0 == pos)  // head 头部插入{return InsertHeadLinkList(ll, data);}else if (pos == len)  // tail  尾部插入{return InsertTailLinkList(ll, data);}else{LinkNode* newnode = malloc(sizeof(LinkNode));  申请结点if (NULL == newnode){fprintf(stderr, "InsertPosLinkList malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;int i = 0;  LinkNode* tmp = ll->head;    for (i = 0; i < pos - 1; ++i)   让指针指向要插入位置的前一个结点{tmp = tmp->next;}newnode->next = tmp->next;tmp->next = newnode;}ll->clen++;return 0;
}int ModifyLinkList(LinkList* ll, char* name, DATATYPE* data)  //修改指针中的数据
{DATATYPE* tmp = FindLinkList(ll, name);  if (NULL == tmp){return 1;}memcpy(tmp, data, sizeof(DATATYPE));return 0;
}int DestroyLinkList(LinkList** ll)  //销毁链表
{while (1)                            //需要先一个一个结点free最后free(linklist){LinkNode* tmp = (*ll)->head;if (NULL == tmp){break;}(*ll)->head = (*ll)->head->next;free(tmp);}free(*ll);*ll = NULL;return 0;
}
//可通过 valgrind ./执行文件名  看内存是否泄露,即没有free干净LinkNode* FindMidLinkList(LinkList* ll)  //找链表中间结点
{LinkNode* fast = ll->head;  //申请两个指针,一个一次走一步,一个一次走两步,走两步的走完链表时LinkNode* slow = ll->head;  //,走一步的指针刚好到中间。while (fast){fast = fast->next;if (NULL == fast){break;}slow = slow->next;fast = fast->next;}return slow;
}/*** @brief 查找倒数第k个节点** @param ll 需要查找的对应的链表* @param k 倒数第k个节点 k>0   <len* @return LinkNode* 找到对应的节点的指针*/LinkNode* FindLastKLinkList(LinkList* ll, int k) //与找中间的类似,只是,走的快的和走的慢的指针
{LinkNode* slow = ll->head;                     //始终保持 k 个结点距离LinkNode* fast = ll->head;for (int i = 0; i < k; i++){fast = fast->next;}while (fast){fast = fast->next;slow = slow->next;}return slow;
}int RevertLinkList(LinkList* ll)     //逆序链表结点
{LinkNode* prev = NULL;        //指向 逆序结点的前一个结点LinkNode* tmp = ll->head;     //指向 逆序的结点LinkNode* next = tmp->next;   //指向 逆序结点的下一个结点int len = GetSizeLinkList(ll);if (len < 2)            //如果链表长度 <2 则不需要逆序{return 1;}while (1) {tmp->next = prev; prev = tmp;tmp = next;if (NULL == tmp)  //当指向 需要逆序的结点指针为空时,说明没有结点了,跳出循环break;next = next->next;}ll->head = prev;return 0;
}int InsertSortLinkList(LinkList* ll)  //对链表进行插入排序,依据年龄
{LinkNode*pins = ll->head;    //三个指针,pins指向头结点,ptmp指pins指向结点的下一个LinkNode* ptmp = pins->next; //Next指向pins指向结点的下一个结点。LinkNode* Next = ptmp->next;ptmp->next = NULL;   //置空ll->head->next = NULL; //置空while(1){pins = ll->head;while(pins->next && ptmp->data.age > pins->data.age )   //pins的下一个结点存在 并且下一个{                                            //结点的age > pins 的age 则pins指向下一个pins = pins->next;                                      } if(pins->data.age > ptmp->data.age) //head   如果第是头节点的下一个结点需要插入排序{ptmp->next = ll->head;ll->head = ptmp;}else{ptmp->next = pins->next;pins->next = ptmp;}ptmp = Next;if(NULL == ptmp) { break; }Next = Next->next;ptmp->next = NULL;}return 0;
}

三、顺序表和链表对比


1、存储方式
        顺序表 是一段连续的存储单元


        链表 是逻辑结构连续物理结构(在内存中的表现形式)不连续(因为是通过malloc获得的)

2、 时间性能
        查找 :          顺序表O(1)      //按规则放,找的时候按规则找;支持随机访问

                              链表  O(n)        //只能从第一个往后找

        插入和删除:顺序表 O(n)      //整体前移与后移

                             链表   O(1)        //一次性改(只需把一个节点连上),与链表数据量无关

3、 空间性能
        顺序表 需要预先分配空间,大小固定;只放数据
        链表, 不需要预先分配,大小可变,动态分配;数据 + 指针域

相关文章:

数据结构day3

一、gdb调试 gcc -g main.c linklist.c // 对两个.c文件进行编译,生成 a.out 文件 gdb a.out //调试可执行文件 a.out b linklist.c:36 // 在该.c文件第 36 行设置断点 r // 运行程序,但会在断点前停…...

VSCode launch.json 配置参数详解

使用 launch.json 配置调试环境时&#xff0c;会涉及到多个参数&#xff0c;用于定义调试器的行为和目标执行环境。以下是一些常用的配置参数&#xff1a; 1、"type" &#xff1a;指定调试器的类型&#xff0c;例如 "node" 表示 Node.js 调试器&#xff0…...

[已解决] LaTeX “Unicode character“ 报错 (中文字符处理)

问题&#xff1a; 写 LaTeX 文档&#xff0c;特别是包含中文时&#xff0c;经常遇到类似下图的 “Unicode character XXXXXX” 报错 (X) Unicode character 本 (U672C) LaTeX [行 xx, 列 x] (X) Unicode character 报 (U62A5) LaTeX [行 xx, 列 x] ...这通常意味着我们的 LaTe…...

c++成员函数返回类对象引用和直接返回类对象的区别

c成员函数返回类对象引用和直接返回类对象的区别 成员函数直接返回类对象&#xff08;返回临时对象&#xff0c;对象拷贝&#xff09; #include <iostream> class MyInt { public:int value;//构造函数explicit MyInt(int v0) : value(v){}//加法操作,返回对象副本&…...

python项目参考文献

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

Go语言实现链式调用

在 Go 语言中实现链式调用&#xff08;Method Chaining&#xff09;&#xff0c;可以通过让每个方法返回对象本身&#xff08;或对象的指针&#xff09;来实现。这样每次方法调用后可以继续调用其他方法。 示例&#xff1a;实现字符串的链式操作 假设你想对一个字符串连续执行…...

深入解析SpringMVC:从入门到精通

上文了解到SpingBoot的相关知识&#xff0c;此文开启Sping家族下的新篇章 1. 什么是SpringWebMVC&#xff1f; 官方对于SpringMVC的描述是这样的&#xff1a; 什么是Servlet呢? Servlet 是⼀种实现动态页面的技术.准确来讲Servlet是⼀套JavaWeb开发的规范&#xff0c;或者说…...

Java-Collections类高效应用的全面指南

Java-Collections类高效应用的全面指南 前言一、Collections 类概述二、Collections 类的基础方法2.1 排序操作2.1.1 sort方法2.1.2 reverse方法2.1.3 shuffle方法 2.2 查找与替换操作2.2.1 binarySearch方法2.2.2 max和min方法2.2.3 replaceAll方法 三、Collections 类的高级应…...

微软家各种copilot的AI产品:Github copilot、Microsoft copilot

背景 大家可能听到很多copilot&#xff0c;比如 Github Copilot&#xff0c;Microsoft Copilot、Microsoft 365 Copilot&#xff0c;有什么区别 Github Copilot&#xff1a;有网页版、有插件&#xff08;idea、vscode等的插件&#xff09;&#xff0c;都是面向于程序员的。Mi…...

JAVA EE_HTTP

为什么意气风发的少年&#xff0c;总是听不进去别人的劝解。 ​​​​​​​ ​​​​​​​ ----------陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE_网络原理_数据链路层-CSDN博客 1.HTTP 1.1.HTTP是什么 H…...

SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据

在搜索引擎算法日益复杂的今天&#xff0c;B2C商城想要在海量信息中脱颖而出&#xff0c;仅靠优质商品和营销活动远远不够。ZKmall模板商城以实战为导向&#xff0c;通过URL 重构与结构化数据优化两大核心策略&#xff0c;帮助 B2C 商城实现从底层架构到搜索展示的全面升级&…...

使用HtmlAgilityPack采集墨迹天气中的天气数据

需要解析对应的HTML源码&#xff1a; <div class"left"><div class"wea_alert clearfix"><ul><li><a href "https://tianqi.moji.com/aqi/china/jiangxi/hukou-county" >< span class"level level_2&qu…...

广和通L610模块通过AT指令访问服务器方案:嵌赛使用

实现步骤及关键点&#xff1a; 网络连接配置 ATCGDCONT1,"IP","APN名称" // 设置APN ATCGACT1,1 // 激活PDP上下文 ATCGATT1 // 附着GPRS网络 HTTP协议支持验证 L610支持HTTP客户端功能&#xff0c;关键指…...

nodejs快速入门到精通1

参考 nodejs快速入门到精通 菜鸟教程-nodejs nodejs官方文档 原因 视频免费 资料收费 笔记还是自己写吧 安装 nodejs官网 windows下&#xff1a; #查看nodejs版本 node -v #查看npm版本 npm -v #设置npm为淘宝镜像源 npm config set registry https://registry.npmmirror.…...

Linux下软件安装

一、软件安装方式 在 Linux 系统中&#xff0c;常见的软件安装方式有以下几种&#xff1a; 包管理器安装&#xff08;如 yum、apt&#xff09; 这是最便捷的安装方式&#xff0c;通过系统自带的包管理器从官方软件源下载并安装软件。 # CentOS/RHEL系统使用yum安装 yum insta…...

React Fiber 架构深度解析:时间切片与性能优化的核心引擎

文章目录 前言一、Fiber 架构的诞生背景二、Fiber 架构的核心概念1. Fiber 节点2. Fiber 节点的结构3. 双缓存机制4. 增量渲染与优先级调度 三、时间切片技术详解1. 时间切片的定义与原理2. 时间切片与 JavaScript 事件循环3. 时间切片的实现方式4. 时间切片的优势 四、Fiber 架…...

mcp学习笔记

MCP&#xff08;Model Context Protocol&#xff09;是一种由Anthropic推出的开放协议&#xff0c;旨在统一大型语言模型&#xff08;LLM&#xff09;与外部数据源/工具之间的交互。其核心组件包括 ​MCP Client、MCP Server​ 和 ​Function Calling​ 机制&#xff0c;三者协…...

鸿蒙北向源码开发: 检查应用接口dts文件api规范性

开源鸿蒙5.0.2对应的api版本是14 5.0社区仓有工具检查接口规范性报告工具: interface/sdk-js/build-tools/api_check_plugin api_check_plugin是什么? 在解释api_check_plugin是什么之前得先知道 应用调用的api接口都是文件名后缀为.d.ts的文件,这些文件内部声明了arkts的a…...

Redis设计与实现——分布式Redis

Redis Sentinel&#xff08;哨兵&#xff09; Sentinel 的工作机制 故障检测&#xff08;Failure Detection&#xff09; 主观下线&#xff08;Subjective Down&#xff09;&#xff1a;单个 Sentinel 实例检测到主节点在30 秒内无响应&#xff0c;标记其为 SDOWN。 客观下线…...

【Redis】Hash 哈希

文章目录 常用命令hsethgethmgethexistshkeyshvalshgetallhdelhlenhsetnxhincrbyhincrbyfloat 内部编码应用场景 Redis 存储键值对&#xff0c;也就是 key - value&#xff0c;不过同时也允许 value 也为键值对&#xff0c;但此时为了避免冲突&#xff0c;为 field - value PS…...

【matlab技巧】通过手绘的方法设计二维运动轨迹,附MATLAB程序

代码提供了一种直观的方式来使用鼠标在图形窗口中绘制线条&#xff0c;同时能够记录并显示用户绘制的轨迹坐标。用户通过左键点击绘制点&#xff0c;右键点击结束绘制&#xff0c;适合用于简单的图形交互和数据可视化。 文章目录 代码作用运行MATLAB源代码代码详解 代码作用 这…...

游戏引擎学习第290天:完成分离渲染

game_sim_region.cpp&#xff1a;在BeginSim中移除EntityOverlapsRectangle调用 现在我们接近一个关键点&#xff0c;虽然还没完全结束&#xff0c;但我们已经把所有东西迁移到了一个新概念上——即那些临时创建的控制器结构&#xff0c;称为“脑”&#xff08;brains&#xf…...

uniapp-商城-61-后台 新增商品(添加商品到数据库)

完成商品的布局&#xff0c;完成商品的属性添加&#xff0c;最后的目的还是要完成数据添加&#xff0c;将我们前台的数据添加后台的数据库。 1、界面 2、点击提交完成商品添加 点击下方的提交按钮&#xff0c;将数据添加到数据库。 onSubmit 使用该函数---见3 <view cla…...

深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第一篇:I2C总线协议深度解剖

第一篇&#xff1a;I2C总线协议深度解剖 副标题 : 两根线如何征服千亿设备&#xff1f;详解硬件工程师必须掌握的通信奥义 1. 为什么I2C仍是嵌入式经典&#xff1f; 1.1 总线拓扑的哲学 拓扑对比图 SPI需4线N片选 vs I2C仅2线级联 UART点对点 vs I2C多主从架构 成本控制实…...

QT之LayOut布局

文章目录 QFormLayoutQGridLayoutQFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例用QFormLayout 代替 界面左边部分的QGridLayout QFormLayout #include "widget.h"#include <QFormLayout> #include <QLineEdit>Widget::Widget(QWidget *p…...

ubuntu 24.04安装ros1 noetic

为了后续能够找到安装方法&#xff0c;记录一下&#xff1a; 参考如下链接安装&#xff1a; https://www.reddit.com/r/ROS/comments/158icpy/compiling_ros1_noetic_from_source_on_ubuntu_2204/ 安装步骤如下&#xff1a; 1.获取apt 包 sudo apt-get install python3-ros…...

动态规划-64.最小路径和-力扣(LetCode)

一、题目解析 从左上角到右下角使得数字总和最小且只能向下或向右移动 二、算法原理 1.状态表示 我们需要求到达[i,j]位置时数字总和的最小值&#xff0c;所以dp[i][j]表示&#xff1a;到达[i,j]位置时&#xff0c;路径数字总和的最小值。 2.状态转移方程 到达[i,j]之前要先…...

Python爬虫(29)Python爬虫高阶:动态页面处理与云原生部署全链路实践(Selenium、Scrapy、K8s)

目录 引言&#xff1a;动态爬虫的技术挑战与云原生机遇一、动态页面处理&#xff1a;Selenium与Scrapy的协同作战1.1 Selenium的核心价值与局限1.2 Scrapy-Selenium中间件开发1.3 动态分页处理实战&#xff1a;京东商品爬虫 二、云原生部署&#xff1a;Kubernetes架构设计与优化…...

FauxGen:一款由 CodeBuddy 主动构建的假数据生成器

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在前端开发中&#xff0c;经常需要一些「假数据」来模拟真实接口&#xff0c;便于开发阶段的界面构建和功能测试…...

chrome 浏览器插件 myTools, 日常小工具。

1. 起因&#xff0c; 目的: 比如&#xff0c;chatgpt, google&#xff0c; 打开网页&#xff0c;就能直接输入文字&#xff0c;然后 grok 就不行&#xff0c;必须用鼠标点一下&#xff0c;才能输入文字。 对我而言&#xff0c;是个痛点&#xff01;写个插件&#xff0c;自动点…...

从代码学习深度学习 - 词嵌入(word2vec)PyTorch版

文章目录 前言1. 为什么需要词嵌入?2. 早期尝试:独热向量 (One-Hot Vectors)独热向量的局限性3. 自监督的 word2vec4. 跳元模型 (Skip-Gram Model)4.1. 训练5. 连续词袋 (CBOW) 模型5.1. 训练总结前言 自然语言处理(NLP)是人工智能领域中一个充满活力和挑战的分支。要让计…...

手写tomcat:基本功能实现(4)

逻辑架构 HTTP 请求与 Socket&#xff1a; 左侧的 “HTTP 请求” 箭头指向 “socket”&#xff0c;表示客户端发送的 HTTP 请求通过 socket 传输到服务器。Socket 负责接收请求&#xff0c;并提取出其中的 请求路径&#xff08;如 /first&#xff09;和 请求方法&#xff08;如…...

String的一些固定程序函数

append reverse length toString...

SECERN AI提出3D生成方法SVAD!单张图像合成超逼真3D Avatar!

SECERN AI提出的3D生成方法SVAD通过视频扩散生成合成训练数据&#xff0c;利用身份保留和图像恢复模块对其进行增强&#xff0c;并利用这些经过优化的数据来训练3DGS虚拟形象。SVAD在新的姿态和视角下保持身份一致性和精细细节方面优于现有最先进&#xff08;SOTA&#xff09;的…...

windows触摸板快捷指南

以下是结构化整理后的触控手势说明&#xff0c;采用清晰的层级划分和标准化表述&#xff1a; **触控手势操作规范****1. 单指操作****2. 双指操作****3. 三指操作****4. 四指操作** **优化说明&#xff1a;** 触控手势操作规范 1. 单指操作 手势功能描述等效操作单击滑动选择…...

Mipsel固件Fuzzing小记

Mipsel固件Fuzzing小记 0x01 准备 1.1 安装必要工具链 首先需要安装 MIPS 交叉编译工具链和相关依赖&#xff1a; sudo apt-get install -y gcc-mipsel-linux-gnu g-mipsel-linux-gnu binwalk qemu-user-static afl这些工具分别用于&#xff1a;交叉编译、固件解包、二进制…...

边缘计算:物联网的“加速器”与“守护者”

引言 随着物联网&#xff08;IoT&#xff09;的快速发展&#xff0c;越来越多的设备接入网络&#xff0c;产生了海量的数据。传统的云计算架构面临着延迟高、带宽不足、数据安全等问题。边缘计算作为一种新兴技术&#xff0c;正在成为解决这些问题的关键手段。本文将探讨边缘计…...

简单网络交换、路由-华三RRPP以太环网

1、RRPP简单介绍 RRPP用来组建环网的链路层协议&#xff0c;工作在二层&#xff0c;比STP收敛更快&#xff0c;同时与STP、Smart-link互斥。很多企业很少应用环网组网&#xff0c;但是小编所在工业生产制造企业在特定工艺的区域对环网应用颇多&#xff0c;RRPP小编还是推荐网工…...

Kotlin变量与数据类型详解

Kotlin 变量与基本数据类型详解 一、变量声明 1. val vs var val&#xff1a;不可变变量&#xff08;只读&#xff09;&#xff0c;类似 Java 的 finalvar&#xff1a;可变变量 val name "Kotlin" // 类型推断为 String var age 25 // 类型推断为 I…...

【Redis】List 列表

文章目录 初识列表常用命令lpushlpushxlrangerpushrpushxlpop & rpoplindexlinsertllen阻塞操作 —— blpop & brpop 内部编码应用场景 初识列表 列表类型&#xff0c;用于存储多个字符串。在操作和实现上&#xff0c;类似 C 的双端队列&#xff0c;支持随机访问(O(N)…...

React中useState中更新是同步的还是异步的?

文章目录 前言一、useState 的基本用法二、useState 的更新机制1. 内部状态管理2. 状态初始化3. 状态更新 三、useState 的更新频率与异步行为1. 异步更新与批量更新2. 为什么需要异步更新&#xff1f; 四、如何正确处理 useState 的更新1. 使用回调函数形式的更新2. 理解异步更…...

Python语法强化

在正式编写第一个Python程序前&#xff0c;我们先复习一下什么是命令行模式和Python交互模式。 命令行模式 在Windows开始菜单选择“Terminal”&#xff0c;就进入到PowerShell命令行模式&#xff0c;它的提示符类似PS C:\>&#xff1a; ┌───────────────…...

FastMCP:为大语言模型构建强大的上下文和工具服务

FastMCP&#xff1a;为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;已经成为许多应用的核心。然而&#xff0c;如何让这些模型更好地与外部世界交互&#xff0c;获取实时信息&#xff0c;执行特定任务&am…...

TC3xx学习笔记-UCB BMHD使用详解(二)

文章目录 前言Confirmation的定义Dual UCB: Confirmation StatesDual UCB: Errored State or ECC Error in the UCB Confirmation CodesECC Error in the UCB ContentDual Password UCB ORIG and COPY Re-programming UCB_BMHDx_ORIG and UCB_BMHDx_COPY (x 0-3)BMHD Protecti…...

【Docker】docker compose和docker swarm区别

Docker Swarm 和 Docker Compose 的核心区别&#xff1a; 1. 定位不同 Docker Compose 单机多容器编排&#xff1a;在单个主机上管理多个容器&#xff0c;适合本地开发、测试环境。单节点部署&#xff1a;所有容器运行在同一 Docker 引擎实例上。 Docker Swarm 集群管理工具&…...

Power BI Desktop开发——矩阵相关操作

本篇文章使用2025年5月17日从微软商店下载的最新版Power BI Desktop 目录 1.设置矩阵网格整体大小 2.设置矩阵网格行高 3.设置矩阵网格列宽 4.隐藏矩阵网格的某一列 5.隐藏矩阵网格的某一行 6.设置矩阵网格居中展示 7.号图表的显示设置 8.调整行标题的缩进 9.设置矩阵…...

系统架构设计(九):分布式架构与微服务

基础定义 架构类型定义分布式架构指将系统部署在多个服务器节点上&#xff0c;通过网络协作完成整体功能。强调物理上的分布与任务协作。微服务架构一种分布式架构模式&#xff0c;将系统按照业务维度拆分为多个小型自治服务&#xff0c;每个服务可独立开发、部署、伸缩。 核…...

Linux服务器安全如何加固?禁用不必要的服务与端口如何操作?

保护Linux服务器的安全性对于确保系统的稳定性和数据的保密性至关重要。加固Linux服务器的安全性包括禁用不必要的服务和端口&#xff0c;以减少潜在的攻击面。本文将探讨如何加固Linux服务器的安全性&#xff0c;具体介绍如何禁用不必要的服务和端口&#xff0c;从而提高服务器…...

AgentCPM-GUI,清华联合面壁智能开源的端侧GUI智能体模型

AgentCPM-GUI是什么 AgentCPM-GUI 是由清华大学与面壁智能团队联合开发的一款开源端侧图形用户界面&#xff08;GUI&#xff09;代理&#xff0c;专为中文应用进行优化。基于 MiniCPM-V 模型&#xff08;80 亿参数&#xff09;&#xff0c;该系统能够接收智能手机的屏幕截图&a…...

如何用AI优化简历:自动读取与精华浓缩

在求职过程中&#xff0c;一份出色的简历往往是成功的关键。然而&#xff0c;许多求职者在撰写简历时往往面临诸多挑战&#xff0c;比如如何让简历更突出、如何让招聘者快速了解自己的核心优势等。随着人工智能技术的发展&#xff0c;AI不仅可以帮助我们优化简历内容&#xff0…...