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

【数据结构】单链表之--无头单向非循环链表

前言:前面我们学习了动态顺序表并且模拟了它的实现,今天我们来进一步学习,来学习单链表!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印!

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:数据结构 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


单链表

今天我们要实现的全部功能就如下所示,功能很多我们一步一步来,一起来手撕链表吧!加油!

typedef int SLNDataType;typedef struct SList
{int val;struct SList* next;
}SLNode;//单链表的打印
void SLTPrint(SLNode* phead);//单链表的尾插
void SLTPushBack(SLNode** pphead, SLNDataType x);//单链表的头插
void SLTPushFront(SLNode** pphead, SLNDataType x);//单链表的尾删
void SLTPopback(SLNode** pphead);//单链表的头删
void SLTPopFront(SLNode** pphead);//单链表的元素查找
SLNode* SLFind(SLNode* phead, SLNDataType x);//单链表的插入-在pos的前面插入
SLNode* SLInsert(SLNode** pphead,SLNode* pos, SLNDataType x);//需要自己思考一级还是二级//单链表的删除
void SLTErase(SLNode** pphead, SLNode* pos);//单链表的销毁
void SLTDestroy(SLNode** pphead);//单链表的删除-pos之后的元素
void SLTEraseAfter(SLNode* pos,SLNDataType x);//单链表插入-pos之后插入
void SLTInsertAfter(SLNode* pos,SLNDataType x);

动态申请一个结点

代码思路,首先我们要开辟一个结构体,来开始我们今天的单链表

typedef struct SList
{int val;struct SList* next;
}SLNode;

当然了,我们肯定得写一个接口,来申请动态开辟的一个结点(这个我们在前面写顺序表的时候就写过了,就不过多介绍这个了),可以看下图帮助自己理解在这里插入图片描述

SLNode* CreateNewNode(SLNDataType x)//开辟一个新的节点
{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));if (newnode == NULL)//判断是否有空间{perror("malloc fail");exit(-1);}newnode->val = x;newnode->next = NULL;return newnode;
}

单链表的打印

代码思路:单链表中我们可以知道它是如下图这种形式,每一个结构体中存着下个节点的地址,我们可以通过判断结构体指针是否为空指针来依次打印
在这里插入图片描述

void SLTPrint(SLNode* phead)
{SLNode* cur = phead;//通过头节点依次访问while (cur != NULL){printf("%d->", cur->val);cur = cur->next;}printf("NULL\n");
}

单链表的尾插

在写代码之前,我们需要重新复习一下,对形参的修改不会改变实参,形参是实参的一个临时拷贝(请牢牢记住,后面有很大的作用),这在后面帮助我们理解单链表有很大的帮助。
我们先来看一串代码

void swap(int* a, int* b)
{int tmp = 0;tmp = *a;*a = *b;*b = tmp;
}int main()
{int a = 3;int b = 5;swap(&a, &b);printf("a = %d,b = %d", a, b);return 0;
}

我们要想改变
在这里插入图片描述


void swap(int** a, int** b)
{int tmp = 0;tmp = **a;**a = **b;**b = tmp;
}int main()
{int arr1[] = { 1 };int arr2[] = { 2 };int* a = arr1;int* b = arr2;swap(&a, &b); printf("*a = %d, *b = %d",*a, *b);return 0;
}

在这里插入图片描述
由这些可以知道,我们要想修改一级指针里面的值,我们要用二级指针接收。接下来我们就开始上我们的第一盘凉菜了!
代码思路:首先我们肯定要考虑两种情况,即一种是链表是空的什么都没有,另一种即链表中有值,需要我们尾增新的值,我们可以借助下图来帮助我们分析!我们通过循环找到该链表的尾结点,然后让尾部结点中的next,假如链表中没有值是空链表,我们直接指向新的结点即可。
在这里插入图片描述

void SLTPushBack(SLNode** pphead, SLNDataType x)//尾插节点
{assert(pphead);//判断传过来的链表是否存在SLNode* newnode = CreateNewNode(x);//开辟节点if (*pphead == NULL)//判断传来的是否是空指针,如果为空就直接开辟新的节点{*pphead = newnode;}else{SLNode* tail = *pphead;while (tail->next != NULL)//只有尾结点的next才是空{tail = tail->next;//找到尾节点}tail->next = newnode;//将为节点的值指向新节点}
}

这里大家肯定会有很多疑问,为什么是 **phead ,我们来看下图
在这里插入图片描述


函数测试与结果运行图:

void Test1()
{SLNode* plist = NULL;SLTPushBack(&plist, 1);//尾插SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);
}int main()
{Test1();return 0;
}

在这里插入图片描述


单链表的头插

代码思路:单链表的头插我们依然得借助图像来帮助我们分析如下图,我们让*phead指向newnode开辟的结点,在让newnode->next指向原本的头结点即可完成头插,当然我们依然得用二级指针接收,因为我们要修改的一级指针。
在这里插入图片描述
代码实现:

void SLTPushFront(SLNode** pphead, SLNDataType x)//单链表的头插
{assert(pphead);SLNode* newnode = CreateNewNode(x);//开辟一个新的节点newnode->next = *pphead;//将头节点地址存放在next中*pphead = newnode;  //在让头节点指向Newnode,此时newnode就称为了头节点
}

函数测试与效果图:

void Test2()
{SLNode* plist = NULL;SLTPushFront(&plist, 2);//头插SLTPushFront(&plist, 2);SLTPushFront(&plist, 9);SLTPrint(plist);
}int main()
{//Test1();Test2();return 0;
}

在这里插入图片描述


单链表的尾删

思路分析:在单链表的尾部删除中,我们需要考虑两种情况一种为单节点,一种为多节点,即一种删除完后链表中的值为空,另一种即删除最后一个后仍然还有结点。当然了,我们依然得先画图分析,如下图。我们看图一,可以知道,我们直接找到 *phead这个结点将他free掉即可,然后将 *phead置为空指针,即可完成单结点的删除。我们看图二,我们得找到一个尾结点将它释放,将尾部结点的前一个结点中的next即保留最后一个结点中的地址,让它置为空指针即删除完毕,由此我们可以通过一个快慢指针,一个指针往后走,一个保留前一个结点的地址,因此我们可以找到最后一个结点并保留前一个结点的地址。
在这里插入图片描述


在这里插入图片描述


代码思路:

void SLTPopback(SLNode** pphead)//单链表的尾删
{//一个节点//多个节点assert(pphead);assert(*pphead);if ((*pphead)->next == NULL)//单节点{free(*pphead);//释放pphead所在的空间*pphead = NULL;//将pphead置为空指针}else//多节点{SLNode* tail = *pphead;//铜鼓快慢指针来找到节点SLNode* prev = NULL;while (tail->next != NULL)//找到尾节点{//倒数第一步(尾节点的前一个节点时)prev = tail;//此时prev就是记录后一个节点的地址tail = tail->next;//此时找到了NULL}free(tail);//释放掉记录尾结点的地址prev->next = NULL;//将此时赋值为NULL即删除成功}
}

函数测试与运行结果:

void Test3()
{SLNode* plist = NULL;printf("打印删除之前的\n");SLTPushFront(&plist, 2);//头增SLTPushFront(&plist, 2);SLTPushFront(&plist, 9);SLTPrint(plist);printf("打印删除之后的\n");SLTPopback(&plist);//尾删SLTPopback(&plist);SLTPrint(plist);
}int main()
{//Test1();//Test2();Test3();return 0;
}

在这里插入图片描述


单链表的头删

思路分析:实现头删,我们就是把头部中的空间free掉,在将 *phead指向原本的第二个节点即可,因此我们需要用一个结构体指针指向第二个节点将其保留下来传给原本的头指针。可以通过下图帮助自己分析,如下图。
在这里插入图片描述
代码思路实现:

void SLTPopFront(SLNode** pphead)//头删
{//空assert(pphead);//多个节点SLNode* tmp = (*pphead)->next;free(*pphead);*pphead = tmp;	
}

测试函数与运行结果:

void Test4()
{SLNode* plist = NULL;printf("打印删除之前的\n");SLTPushFront(&plist, 2);//尾增SLTPushFront(&plist, 2);SLTPushFront(&plist, 9);SLTPrint(plist);printf("打印删除之后的\n");SLTPopFront(&plist);//头删SLTPopFront(&plist);SLTPrint(plist);
}
int main()
{//Test1();//Test2();//Test3();Test4();return 0;
}

在这里插入图片描述


单链表的数值查找

思路分析:我们可以通过指针去一次遍历链表中的数据,找到对应值即找到了,返回此时指针的地址,遍历到最后一个NULL也没有找到时,即返回空指针,如下图在这里插入图片描述
代码实现:

SLNode* SLFind(SLNode* phead, SLNDataType x)//查找
{assert(phead);SLNode* tail = phead;while (tail){if(tail->val == x){return tail;//返回此时指针的值}tail = tail->next;}return NULL;
}

函数测试与效果图:

void Test5()
{SLNode* plist = NULL;printf("打印删除之前的\n");SLTPushFront(&plist, 2);//尾增SLTPushFront(&plist, 2);SLTPushFront(&plist, 9);SLTPrint(plist);printf("查找结果:\n");printf("%p\n",SLFind(plist, 2));//查找数printf("%p\n", SLFind(plist, 99));
}
int main()
{//Test1();//Test2();//Test3();//Test4();Test5();return 0;
}

在这里插入图片描述


单链表的插入- 在pos的前面插入

思路分析:如果是多节点要想实现在pos的前面插入,首先我们要找到pos的前面一个节点让它指向我们新开辟的节点newnode然后再让newnode->next指向我们原本pos的所在的节点就完成了头插,如下图1所示。如果是单节点的时候,就是相当于头插,我们只需要判断是否是单节点,如果是就直接调用头插函数即可。
在这里插入图片描述
代码实现:

SLNode* SLInsert(SLNode** pphead, SLNode* pos, SLNDataType x)//单链表插入
{assert(pphead);assert(pos);assert(*pphead);//单节点if (*pphead == pos){//头插SLTPushFront(pphead, x);}else{//多节点SLNode* tail = *pphead;SLNode* newnode = CreateNewNode(x);while (tail->next != pos){tail = tail->next;}tail->next = newnode;newnode->next = pos;}
}

函数测试与效果图:

void Test6()
{SLNode* plist = NULL;printf("原本的值\n");SLTPushFront(&plist, 2);//尾增SLTPushFront(&plist, 2);SLTPushFront(&plist, 9);SLTPrint(plist);printf("插入之后的结果\n");SLNode* address = SLFind(plist, 2);//查找数SLInsert(&plist, address, 10);SLTPrint(plist);
}
int main()
{//Test1();//Test2();//Test3();//Test4();//Test5();Test6();return 0;
}

在这里插入图片描述


单链表数值的删除-删除Pos前的值

思路分析:当然了单链表的删除我们依然得采用俩种情况,一种情况为单节点,一种情况为多节点,我们先来分析多节点,如果是多节点的情况,我们应当找到pos的节点将它释放掉,并且我们应当将pos的前一个节点将他记录下来,并让它指向pos之后的一个节点,此时我们即可完成数值的删除。如下图所示,如果是单节点的情况,我们可以直接当成头删,直接调用头删函数即可。
在这里插入图片描述

代码实例:

void SLTErase(SLNode** pphead, SLNode* pos)//数值的删除
{assert(pphead);//判断传来的结构体是否存在assert(*pphead);//判断是否为空指针assert(pos);//判断空地址if (*pphead == pos){SLTPopFront(pphead);//头删}else{SLNode* tail = *pphead;while (tail->next != pos){tail = tail->next;}tail->next = pos->next;free(pos);pos = NULL;}
}

函数测试与效果图:

void Test7()
{SLNode* plist = NULL;printf("原本的值\n");SLTPushFront(&plist, 2);//尾增SLTPushFront(&plist, 3);SLTPushFront(&plist, 2);SLTPushFront(&plist, 9);SLTPrint(plist);printf("删除之后的结果\n");SLNode* address = SLFind(plist, 2);//查找数SLTErase(&plist, address);SLTPrint(plist);
}
int main()
{//Test1();//Test2();//Test3();//Test4();//Test5();//Test6();Test7();return 0;
}

在这里插入图片描述


单链表的销毁

思路分析:要想销毁单链表中的所有值,我们只需要把单链表中的每个节点给它释放,并最后让头节点指向空指针即可,因此我们需要借助两个指针,一个指针指向tail的下一个节点,当释放掉tail后让tail可以指向下一个节点再依次释放,这样就可以达到链表的销毁的作用,如下图所示。
在这里插入图片描述
代码实例:

void SLTDestroy(SLNode** pphead)//单链表的销毁
{assert(*pphead);//判断传来的是否已经是空指针SLNode* tail = *pphead;SLNode* pre = NULL;while (tail != NULL)//找到尾节点{pre = tail->next;free(tail);//依次释放tail = pre;}*pphead = NULL;
}

函数测试与效果图:

void Test8()
{SLNode* plist = NULL;printf("原本的值\n");SLTPushFront(&plist, 2);//尾增SLTPushFront(&plist, 3);SLTPushFront(&plist, 2);SLTPushFront(&plist, 9);SLTPrint(plist);printf("删除之后的结果\n");SLTDestroy(&plist);SLTPrint(plist);
}int main()
{//Test1();//Test2();//Test3();//Test4();//Test5();//Test6();Test8();return 0;
}

在这里插入图片描述


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🫵🫵🫵 祝各位接下来好运连连 💞

相关文章:

【数据结构】单链表之--无头单向非循环链表

前言:前面我们学习了动态顺序表并且模拟了它的实现,今天我们来进一步学习,来学习单链表!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印! 💖 博主CSDN主页:卫卫卫的个人主页 &#x…...

网络中使用最多的图片格式有哪些

互联网中的图片格式五花八门吧,我常常分不清各种格式的使用场景和区别,有些常见的格式和很少见的,在此总结。 常见格式 常见的图片格式,有 JPEG、PNG、GIF、BMP、WebP、SVG、TIFF、ICO等, 少见的比如:HD…...

个人常用Linux命令

来自 linux命令学习-2023-8-1 153913.md等 1、切换目录 cd //切换目录 cd change directory cd 目录名 cd .. 返回上一级目录 pwd显示当前所处目录cd 绝对路径 cd ~ 表示一个用户的home目录 cd - 表示上一次访问的目录 cd / 表示进入根目录下//新建目录/data,并且进入/data…...

数据结构——常见简答题汇总

目录 1、绪论 2、线性表 3、栈、队列和数组 4、串 5、树与二叉树 6、图 7、查找 8、排序 1、绪论 什么是数据结构? 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括三个方面:逻辑结构、存储结构、数据的运算。 逻辑结…...

josef约瑟低电压继电器 DY-110 10-109V 辅助电源·DC110V 嵌入式面板安装

DY-110/110V电压继电器 系列型号 DY-110电压继电器;GY-110电压继电器; GDY-110电压继电器;DY-110/AC电压继电器; GY-110/AC电压继电器;GDY-110/AC电压继电器; DL-110电压继电器;GL-110电压…...

Visual Studio Code将中文写入变量时,中文老是乱码问题

对于这个问题,我也是弄了很久才知道,编码格式的问题 在此之前我们要先下载个插件 照这以上步骤,最后按F6运行即可,按F6是利用我们刚刚下载的插件进行编译,唯一有一点不好就是,用这种插件运行的话&#xff…...

各省市30米分辨率DEM数据,推荐下载!

今天给大家推荐一个新数据 —— 各省市30米分辨率DEM数据! 各省市30米分辨率DEM数据广泛应用于国土资源调查、水利水电工程、地质灾害预警、城市规划等领域,对于了解区域内的地形地貌、地形分析、土地利用等具有非常重要的意义。 网站搜索“citybox城市…...

操作系统引论(一)

操作系统的地位和目标 计算机系统的组成 系统软件是和硬件相关的,这是它本质的特征。 操作系统在计算机系统中的地位 操作系统的设计目标 可扩充性是面向未来的。 操作系统的作用 1)用户与计算机硬件系统之间的接口 2)计算机系统资源的管…...

2023-11-7 OpenAI 45 分钟发布会:整理发布了哪些内容更新

本心、输入输出、结果 文章目录 2023-11-7 OpenAI 45 分钟发布会:整理发布了哪些内容更新前言发布 GPT-4 Turbo价格问题 推出 OpenAI 推出了「GPTs」六大升级上下文长度升级API 和函数调用控制手段增强模型内部和外部知识库的升级多模态模型微调与定制更高的使用频率…...

索引和事务

文章目录 一、索引1.1 概念1.2 作用1.3 使用场景1.4 使用 二、事务2.1 为什么要使用事务2.2 事务的概念2.3 事务的使用 三、内容重点总结 一、索引 1.1 概念 索引是一种特殊的文件,包含对数据表所有记录的引用指针。在MySQL中,索引是基于一个或多个列的…...

全场景数实融合聚焦北京——2023(第六届)行业信息技术应用创新大会隆重召开

2023年11月3日,2023(第六届)行业信息技术应用创新大会在北京裕龙国际酒店隆重举行。中国当前正处于经济转型的关键时期,数字经济的发展对中国新经济和新格局的形成至关重要,而信息技术是数字经济发展过程中必不可少的技术铺垫,企业对信息技术的应用非常依赖业务场景。因此,本届…...

深入理解强化学习——多臂赌博机:乐观初始值

分类目录:《深入理解强化学习》总目录 目前为止我们讨论的所有方法都在一定程度上依赖于初始动作值 Q 1 ( a ) Q_1(a) Q1​(a)的选择。从统计学角度来说,这些方法(由于初始估计值)是有偏的。对于采样平均法来说,当所有…...

[黑马程序员Pandas教程]——DataFrame数据的增删改操作

目录: 学习目标DataFrame添加列 直接赋值添加列数据删除与去重 删除 df.drop删除行数据df.drop删除列数据数据去重 Dataframe去重Seriers去重修改DataFrame中的数据 直接修改数据replace函数替换数据按条件使用布尔值修改数据执行自定义函数修改数据 Series.apply(…...

【服务器】Java连接redis及使用Java操作redis、使用场景

一、Java连接redis-No-SQL 1、导入依赖 在你的项目里面导入redis的pom依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> </dependency> 2、连接redis 连接redis …...

Spark 基础知识点

Spark 基础 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 什么是Spark 什么是Spark 1.1 定义&#xff1a;Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎 Spark最早源于一篇论文 Re…...

动作捕捉系统通过SDK与LabVIEW通信

运动分析、VR、机器人等应用中常使用LabVIEW对动作捕捉数据进行实时解算。NOKOV度量动作捕捉系统支持通过SDK与LabVIEW进行通信&#xff0c;将动作数据传入LabVIEW。 一、软件设置 1、形影软件设置 1、将模式切换到后处理模式 2、加载一个刚体数据 3、打开软件设置 4、选择网…...

【PTE-day02 sqlmap操作】

1、sqlmap简介 🍇sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等. Sqlmap采用了以下5种独特的SQL注入技术 (1)…...

2021年03月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 不超过100个元素的有序数列&#xff0c;使用二分查找能找到指定的元素&#xff0c;可能的查找次数不包括&#xff1f; …...

2023.10.18 信息学日志

1. CF1689D Lena and Matrix 题目描述 n ⋅ m n \cdot m n⋅m 的矩阵&#xff0c;求矩阵上任意一点坐标使得到矩阵上的关键点曼哈顿距离最大值最小。数据范围&#xff1a; ∑ n ⋅ m ≤ 1 0 6 \sum n \cdot m \leq 10^6 ∑n⋅m≤106 题目概况 来源&#xff1a;Codeforces …...

Modbus封装库(Com,tcp,udp一应俱全)

自行封装在用的Modbus通迅库,集成了com,tcp,udp, 做个笔记吧&#xff0c; 以下头文件&#xff0c; #pragma once #include <functional> #include <vector> #include <string> #include <memory> #ifdef LIBMODBUS_EXPORTS #define LIBMODBUS_EXPORT_…...

开箱即用版Sambert语音合成:多情感AI配音部署与使用

开箱即用版Sambert语音合成&#xff1a;多情感AI配音部署与使用 1. 引言&#xff1a;多情感语音合成的价值与挑战 在智能客服、有声读物、虚拟主播等应用场景中&#xff0c;富有情感表现力的语音合成技术正变得越来越重要。传统语音合成系统往往只能生成单调机械的语音&#…...

百川2-13B-4bits模型微调指南:提升OpenClaw任务执行准确率

百川2-13B-4bits模型微调指南&#xff1a;提升OpenClaw任务执行准确率 1. 为什么需要微调百川模型&#xff1f; 去年夏天&#xff0c;当我第一次用OpenClaw自动化整理电脑上的数千份文档时&#xff0c;遇到了一个尴尬的问题——AI经常把技术文档和私人照片混在一起归类。这让…...

革新性硬件控制工具:OmenSuperHub实现游戏本性能优化与完全掌控

革新性硬件控制工具&#xff1a;OmenSuperHub实现游戏本性能优化与完全掌控 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普暗影精灵系列游戏本设计的开源硬件控制工具&#xff0c;提供完全离线的…...

旧电脑秒变云服务器:用Proxmox VE打造家庭虚拟化实验室(ZFS配置优化版)

旧电脑秒变云服务器&#xff1a;用Proxmox VE打造家庭虚拟化实验室&#xff08;ZFS配置优化版&#xff09; 1. 为什么选择Proxmox VE搭建家庭实验室&#xff1f; 对于个人开发者和技术爱好者来说&#xff0c;拥有一套完整的虚拟化环境是提升技术能力的绝佳途径。Proxmox VE作为…...

python-flask-djangol框架的的畜牧站疾病防控与检测系统

目录技术选型与架构设计核心功能模块实现数据可视化与决策支持移动端适配与离线功能测试与部署方案项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术选型与架构设计 后端采用Python Flask框架&#xff0c;轻量级且灵活性高&…...

如何在macOS上制作Windows启动盘:WinDiskWriter终极指南

如何在macOS上制作Windows启动盘&#xff1a;WinDiskWriter终极指南 【免费下载链接】windiskwriter &#x1f5a5; A macOS app that creates bootable USB drives for Windows. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. 项目地址: h…...

OpenClaw+GLM-4.7-Flash:自动化数据清洗与分析流程

OpenClawGLM-4.7-Flash&#xff1a;自动化数据清洗与分析流程 1. 为什么需要自动化数据流水线 作为一名数据分析师&#xff0c;我每天要处理大量原始数据。这些数据可能来自Excel表格、数据库导出或者网页抓取&#xff0c;格式混乱、缺失值多、重复记录频发。传统的手工清洗不…...

OpenClaw对接nanobot镜像:低成本实现本地AI助手自动化任务

OpenClaw对接nanobot镜像&#xff1a;低成本实现本地AI助手自动化任务 1. 为什么选择OpenClawnanobot组合 去年夏天&#xff0c;当我第一次尝试用AI自动化处理日常工作时&#xff0c;发现大多数方案要么需要昂贵的云服务API调用&#xff0c;要么对硬件要求极高。直到遇到Open…...

OpenClaw配置备份指南:GLM-4.7-Flash环境快速迁移方案

OpenClaw配置备份指南&#xff1a;GLM-4.7-Flash环境快速迁移方案 1. 为什么需要环境迁移&#xff1f; 上周我的主力开发机突然硬盘故障&#xff0c;导致精心配置的OpenClaw环境全部丢失。重装后发现要重新对接GLM-4.7-Flash模型、配置飞书通道、安装十几个自定义技能——这个…...

5个核心功能提升音频处理效率:AsrTools语音转文字工具用户指南

5个核心功能提升音频处理效率&#xff1a;AsrTools语音转文字工具用户指南 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into a…...