02线性表 - 链表
这里是只讲干货不讲废话的炽念,这个系列的文章是为了我自己以后复习数据结构而写,所以可能会用一种我自己能够听懂的方式来描述,不会像书本上那么枯燥和无聊,且全系列的代码均是可运行的代码,关键地方会给出注释^_^
全文1W+字
版本:C++17
编译器:Clion 2023.3.24
暂时只给出代码,不会涉及到基础知识的讲解
1.链表的定义
1.1定义链表结点
// 链表的核心是定义结点
typedef struct list_node{ // C语言中必须要先声明 list_node,不然编译器会报错,C++可以忽略这个问题Element value; // 结点存储的数据元素struct list_node *next; // 指向下一个结点的指针
}ListNode;
1.2定义链表头结点
// 链表的表头
typedef struct {ListNode head; // 头结点,通常不存储实际数据,用作链表的起始点int len; // 链表的长度,用于记录链表中实际结点的数量
}LinkList;
2.链表的实现函数
2.1.表的创建以及删除
// 创建链表和删除链表
LinkList *createLinkList(); // 创建一个链表void releaseLinkList(LinkList* linkList); // 释放一个链表
2.2.向表中插入元素
// 三种插入方式
int insertLinkList(LinkList *linkList, int pos, Element val); // 任意位置上插入int headInsertLinkList(LinkList *linkList, Element val); // 头插法int tailInsertLinkList(LinkList *linkList, Element val); // 尾插法
2.3.表的展示
void showLinkList(LinkList *linkList); // 显示链表内的元素
2.4.删除表中的元素
int deleteLinkList(LinkList *linkList, Element val); // 删除链表中的特定元素
2.5逆转链表
void reverseLinklist(LinkList *linkList); // 逆转链表
3.实现函数的代码
3.1 createLinkList函数的实现
函数定义:
LinkList *createLinkList();
函数功能:
该函数用于创建一个空的链表,并返回链表的头结点指针
实现思路:
a.申请一个类型为LinkList,大小为sizeof(LinkList)的头结点b.判空,判断申请是否成功c.初始化LinkList->len = 0, LinkList->head.value = 0(根据实际情况来定义这个值)d.初始化LinkList->head.next = NULLe.返回指向新创建链表头结点的指针
具体实现代码:
LinkList *createLinkList() {LinkList *linkList = (LinkList *) malloc(sizeof (LinkList));if (!linkList){printf("Malloc linklist failed\n");return NULL;}linkList->len = 0; // 表示链表的长度linkList->head.value = 0; // 根据具体的场景来定义这个值linkList->head.next = NULL;printf("Create linklist success!\n");return linkList;
}
测试代码:
int main(){LinkList *linkList= createLinkList();return 0;
}
测试结果:
3.2 releaseLinkList函数的实现
函数定义:
void releaseLinkList(LinkList* linkList);
函数功能:
释放链表中的所有节点(包括头节点),避免内存泄漏
实现思路:
方法一:头删法
a.初始化:
获取链表头结点地址并赋值给 node 指针。
node->next 指向待删除结点的下一个结点,用于备份b.循环删除:
循环遍历链表,条件为 node->next 不为空。
使用 tmp 指针指向要删除的结点 (node->next)。
将 node 的 next 指针指向 tmp 的下一个结点 (tmp->next),移除 tmp 指向的结点。
释放 tmp 指向的结点内存。
更新链表长度,减去 1c.释放头结点:
循环结束后,释放头结点的内存
方法二:循环删除法
a.初始化:
将 node 指针指向链表的头结点的下一个结点,准备开始遍历链表b.循环删除:
使用 while 循环遍历链表,直到到达链表末尾。在循环中:
备份当前要删除的结点到 tmp 指针
将当前结点的 next 指针指向下一个结点,从而将 tmp 指向的结点从链表中移除
释放 tmp 指向的结点的内存
更新链表长度,减去 1c.释放头结点:
最后释放头结点的内存
具体实现代码:
方法一:头删法(不断删除头结点后的那个结点,直到为空)
void releaseLinkList1(LinkList *linkList) {if (linkList){ListNode *node = &linkList->head;// 不断的删除头结点的下一个指向,直到为空(头删法)while (node->next){ListNode *tmp = node->next; // 备份要删除的结点node->next = tmp->next; // 这里为什么不是node = node->next;free(tmp); // 因为这样已经移动了头结点,会失去对前一个节点的引用,可能导致内存泄露linkList->len--;}printf("Release success! LinkList have %d node\n",linkList->len);free(linkList);}
}
方法二:循环删除法
void releaseLinkList2(LinkList *linkList){if (linkList) {ListNode *node = linkList->head.next;// 使用循环遍历链表,释放除头结点外的每个节点(循环删除法)while (node) {ListNode *tmp = node; // 备份当前节点node = node->next; // 移动到下一个节点free(tmp); // 释放当前节点linkList->len--;}printf("Release success! LinkList have %d node\n",linkList->len);free(linkList);}
}
测试代码:
因为需要知道链表中还剩下多少元素,所以先引入加入函数
1.头删法测试代码:
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);insertLinkList(linkList, 2, 888);showLinkList(linkList);insertLinkList(linkList, 1, 888);showLinkList(linkList);tailInsertLinkList(linkList, 999);showLinkList(linkList);tailInsertLinkList(linkList, 111);showLinkList(linkList);releaseLinkList1(linkList);return 0;
}
2.循环删除法测试代码:
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);insertLinkList(linkList, 2, 888);showLinkList(linkList);insertLinkList(linkList, 1, 888);showLinkList(linkList);tailInsertLinkList(linkList, 999);showLinkList(linkList);tailInsertLinkList(linkList, 111);showLinkList(linkList);releaseLinkList2(linkList);return 0;
}
测试结果:
1.头删法测试结果:
2.循环删除法测试结果:
3.3 insertLinkList && headInsertLinkList && tailInsertLinkList 函数的实现
函数定义:
int insertLinkList(LinkList *linkList, int pos, Element val); // 任意位置上插入int headInsertLinkList(LinkList *linkList, Element val); // 头插法int tailInsertLinkList(LinkList *linkList, Element val); // 尾插法
函数功能:
1.insertLinkList
在链表的指定位置插入新节点
2.headInsertLinkList
在链表头部插入新节点
3.tailInsertLinkList
在链表尾部插入新节点
实现思路:
1.insertLinkList
a.判断链表是否为空,判断插入位置是否合法* 在 pos 的位置上插入,就要找到 pos-1 的位置* pos = 1 逻辑位置上的插入,就定义 cnt = 0 是头节点的位置* pos = 0 逻辑位置上的插入,就定义 cnt = -1 是头节点的位置b.通过遍历找到待插入结点的前一个结点c.判断 node 是否为空(逻辑完备性)d.申请结点,将新节点 newNode->next 设为 NULL,将新节点的 value 设为 vale.将 newNode->next 赋值为 node->next //这两步一定要注意顺序f.将 node->next 赋值为 newNode //这两步一定要注意顺序g.更新链表长度,LinkList->len++
2.headInsertLinkList
a.判断链表是否为空b.申请结点,将新节点 newNode->next 设为 NULL,将新节点的 value 设为 valc.将 newNode->next 赋值为 LinkList->head.next //这两步一定要注意顺序d.将 LinkList->head.next 赋值为 newNode->next //这两步一定要注意顺序e.更新链表长度,LinkList->len++
3.tailInsertLinkList
a.判断链表是否为空b.申请结点,将新节点 newNode->next 设为 NULL,将新节点的 value 设为 valc.判断 LinkList 是否为只有头节点的链表d.如果是只有头节点的链表,则直接插入到头节点后*即 LinkList->head.next = newNode;e.如果不是,则不断循环找到尾节点,之后插入到尾节点后*即 node->next = newNode;g.更新链表长度,LinkList->len++
具体实现代码:
1.insertLinkList
int insertLinkList(LinkList *linkList, int pos, Element val) {if (!linkList){printf("LinkList is null. Insert error!\n");return -1;}if (pos < 1 || pos > linkList->len + 1){printf("Insert position out of range!\n");return -1;}ListNode *node = &linkList->head;int cnt = 0;while (node && cnt < pos - 1){ // 找到待插入位置的前一个位置node = node->next;cnt++;}// 判断是找到了pos-1的位置,还是遍历完链表都没有找到if (node == NULL){ // 为了逻辑完备性,多加一段代码printf("Insert position out of range!\n");return -1;}ListNode *newNode = (ListNode *) malloc(sizeof (ListNode)); //这段是核心代码newNode->next = NULL;newNode->value = val;newNode->next = node->next; // 这里注意顺序,一定要先保存当前结点的下一个结点的位置node->next = newNode;linkList->len++;return 0;
}
2.headInsertLinkList
int headInsertLinkList(LinkList *linkList, Element val) {if (!linkList){printf("LinkList is null. Insert error!\n");return -1;}ListNode *newNode = (ListNode *) malloc(sizeof (ListNode));if (newNode == NULL) {printf("Memory allocation failed.\n");return -1;}newNode->next = NULL;newNode->value = val;newNode->next = linkList->head.next;linkList->head.next = newNode;linkList->len++;return 0;
}
3.tailInsertLinkList
int tailInsertLinkList(LinkList *linkList, Element val) {if (!linkList) {printf("LinkList is null. Insert error!\n");return -1;}ListNode *newNode = (ListNode *) malloc(sizeof(ListNode));if (newNode == NULL) {printf("Memory allocation failed.\n");return -1;}newNode->value = val;newNode->next = NULL; // 初始化新节点的 next 指针为空if (linkList->head.next == NULL) { // 链表为空,直接将新节点插入到头节点linkList->head.next = newNode;} else {ListNode *node = linkList->head.next;while (node->next != NULL) { // 找到最后一个节点node = node->next;}node->next = newNode; // 将最后一个节点的 next 指向新节点}linkList->len++;return 0;
}
测试代码:
1.insertLinkList
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);insertLinkList(linkList, 5, 888);showLinkList(linkList);insertLinkList(linkList, 2, 888);showLinkList(linkList);insertLinkList(linkList, 1, 888);showLinkList(linkList);insertLinkList(linkList,999, 888);showLinkList(linkList);releaseLinkList2(linkList);return 0;
}
2.headInsertLinkList
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);releaseLinkList2(linkList);return 0;
}
3.tailInsertLinkList
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){tailInsertLinkList(linkList, i+100);}showLinkList(linkList);releaseLinkList2(linkList);return 0;
}
测试结果:
1.insertLinkList
2.headInsertLinkList
3.tailInsertLinkList
3.4 void showLinkList(LinkList *linkList);
函数定义:
void showLinkList(LinkList *linkList); // 显示链表内的元素
函数功能:
将链表中的所有元素依次打印到控制台
实现思路:
a.判断传入链表是否为空b.定义 node 为头节点后的第一个节点c.遍历链表,同时打印node->val,直到链表为空
具体实现代码:
void showLinkList(LinkList *linkList) {if (!linkList){printf("LinkList is null. Show error!\n");return;}ListNode *node = linkList->head.next;while (node){printf("%d ", node->value);node = node->next;}printf("\n");
}
测试代码:
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);releaseLinkList2(linkList);return 0;
}
测试结果:
3.5 deleteLinkList函数的实现
函数定义:
int deleteLinkList(LinkList *linkList, Element val)
函数功能:
从链表中删除第一个值为 val 的节点
实现思路:
a.判断传入的链表是否为空b.用循环找到待删除节点的 前一个 结点c.判断链表的下一个结点是否为空(逻辑完备性)d.用一个指针 tmp 指向待删除的结点e.将 node->next(待删除结点的前一个结点) 设为 tmp->next(删除结点的下一个结点)f.释放掉 tmp 的空间g.更新链表长度,LinkList->len--
具体实现代码:
int deleteLinkList(LinkList *linkList, Element val) {if (!linkList) {printf("LinkList is null. Delete error!\n");return -1;}ListNode *node = &linkList->head;while (node->next && node->next->value != val){node = node->next;}if (!node->next){printf("Find element failed! Delete failed!\n");return -1;}ListNode *tmp = node->next; // 注意顺序node->next = tmp->next;free(tmp);linkList->len--;return 0;
}
测试代码:
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);deleteLinkList(linkList, 104);showLinkList(linkList);deleteLinkList(linkList, 100);showLinkList(linkList);deleteLinkList(linkList, 104);showLinkList(linkList);deleteLinkList(linkList, 102);showLinkList(linkList);releaseLinkList2(linkList);return 0;
}
测试结果:
3.6 reverseLinklist函数的实现
函数定义:
void reverseLinklist(LinkList *linkList);
函数功能:
将给定的单链表反转
实现思路:
方法一:
a.判断当前链表是否为空b.初始化
cur = LinkList->head.next (头节点的下一个)
pre = NULL
LinkList->head.next = NULL (注意cur一定要在之前就要赋值)c.循环
备份当前结点 (pre = cur)
移动cur避免丢失 (cur = cur->next)
将pre->next = LinkList->head.next (不断往头节点后插入结点)
将 LinkList->head.next = pre (将头节点指向正确的位置)
方法二:
a.判断当前链表是否为空b.初始化
cur = LinkList->head.next (头节点的下一个)
nxt = NULL
LinkList->head.next = NULL (注意cur一定要在之前就要赋值)c.循环
备份下一个结点 (nxt = cur->next)
将 cur->next = LinkList->head.next (不断往头节点后插入结点)
将 LinkList->head.next = cur (将头节点指向正确的位置)
cur = nxt (避免结点丢失)
方法三:
a. 将链表所有的结点全部压入到栈中(除了头节点)
b. 利用栈先进后出的特性,出栈一个元素,头节点就连接一个元素
c. 注意使用 尾插法 来连接元素
具体实现代码:
方法一(备份当前节点,反转当前结点):
void reverseLinklist1(LinkList *linkList) {if (!linkList) {printf("LinkList is null. Delete error!\n");return;}ListNode *cur = linkList->head.next;ListNode *pre = NULL;linkList->head.next = NULL;while(cur){pre = cur;cur = cur->next;pre->next = linkList->head.next;linkList->head.next = pre;}printf("Reverse success!\n");
}
方法二(备份下一个结点,反转当前结点):
void reverseLinklist2(LinkList *linkList) {if (!linkList) {printf("LinkList is null. Delete error!\n");return;}ListNode *cur = linkList->head.next;ListNode *nxt = NULL;linkList->head.next = NULL;while (cur){nxt = cur->next;cur->next = linkList->head.next;linkList->head.next = cur;cur = nxt;}printf("Reverse success!\n");
}
方法三:
这里在栈的部分写,到时候放一个链接
测试代码:
方法一:
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);reverseLinklist1(linkList);releaseLinkList2(linkList);return 0;
}
方法二:
int main(){LinkList *linkList= createLinkList();for (int i = 0; i < 5; i++){headInsertLinkList(linkList, i+100);}showLinkList(linkList);reverseLinklist2(linkList);releaseLinkList2(linkList);return 0;
}
测试结果:
方法一:
方法二:
相关文章:
02线性表 - 链表
这里是只讲干货不讲废话的炽念,这个系列的文章是为了我自己以后复习数据结构而写,所以可能会用一种我自己能够听懂的方式来描述,不会像书本上那么枯燥和无聊,且全系列的代码均是可运行的代码,关键地方会给出注释^_^ 全…...
高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0
桌面虚拟化作为云时代的主流和热门技术,已经取得了广泛应用。随着生成式 AI 爆炸式发展,CSDN 看到,人工智能正在引发计算、开发、交互三大范式的全面升级,技术开发或将迎来一次全新的科技变革周期,因此 VDI 云桌面随之…...
python3 shutil排除特定或者模糊匹配文件或目录
import shutil import fnmatchdef ignore_files(dir, files):# 定义要忽略的模式ignore_patterns = [file2.txt, dir2, *复制*.py]ignore_list = []<...
Spire.PDF for .NET【文档操作】演示:如何在 C# 中切换 PDF 层的可见性
我们已经演示了如何使用 Spire.PDF在 C# 中向 PDF 文件添加多个图层以及在 PDF 中删除图层。我们还可以在 Spire.PDF 的帮助下在创建新页面图层时切换 PDF 图层的可见性。在本节中,我们将演示如何在 C# 中切换新 PDF 文档中图层的可见性。 Spire.PDF for .NET 是一…...
新文件覆盖旧文件还能复原吗?八大excel文档修复软件免费
新文件覆盖旧文件还能复原吗?文件操作失误,尤其是新文件意外覆盖旧文件的情况时有发生,面对文件被覆盖的情况,我们不仅需要冷静应对,更需要掌握一系列有效的恢复策略。本文将深入探讨八种免费方法,旨在帮助…...
Android 10.0 Launcher3拖拽图标进入hotseat自适应布局功能实现一
1.前言 在10.0的系统rom定制化开发中,在对于launcher3的一些开发定制中,在对hotseat的一些开发中,需要实现动态hotseat居中 的功能,就是在拖拽图标进入和拖出hotseat,都可以保持hotseat居中的功能,接下来分…...
彻底解决idea的编解码问题
一、打开idea,找到Setting,点击File Encoding编解码设置,将以下标红的三个部分全部设置为UTF-8.同理如果你的项目使用的是GBK或者其他编码格式,那么也设置为统一。 二、点击Java Compiler设置补齐-encoding utf-8参数 三、如果你的项目使用到…...
仅两家!云原生向量数据库 PieCloudVector 全项通过信通院「可信数据库」评测
7月16日,2024 可信数据库发展大会在北京隆重举行。大会以“自主、创新、引领”为主题,近百位数据库领域的专家、学者齐聚一堂,带来高质量的数据库技术洞察与实战经验。 本次可信数据库发展大会中,中国信通院正式公布 2024 年上半年…...
vue使用x6画流程图,简单使用
官网 https://x6.antv.antgroup.com/tutorial/getting-started 安装 npm install antv/x6 --save 使用 <template><div>3333<div id"container" style"width: 800px;height: 800px;"></div></div> </template> <…...
低代码中间件学习体验分享:业务系统的创新引擎
前言 星云低代码平台介绍 星云低代码中间件主要面向企业IT部门、软件实施部门的低代码开发平台,无需学习开发语言/技术框架,可视化开发PC网页/PC项目/小程序/安卓/IOS原生移动应用,低门槛,高效率。针对企业研发部门人员少&#…...
阿里云ACP云计算高级攻城狮通用知识
🔥概述 阿里云云计算高级工程师ACP认证是面向使用阿里云云计算产品的架构、开发、运维类人员的专业技术认证,主要考核考生利用阿里云云计算技术服务体系设计稳定、安全、高性能、易扩展、低成本的企业云计算架构的能力。 前提:在写适用人群…...
log4js node日志插件
最近不是特别忙在用express搭建后台项目,在开发过程中遇到了需要输入日志的问 本来想直接用node自带的console来实现,后来发现console输出的日志达不到自己希望的 日志格式,后来各种百度发现了log4js插件,本文来记录log4js插件使用…...
【MQTT(3)】开发一个客户端,QT-Android安卓手机版本
手机版本更加方便 生成安卓库 参考了这个代码 在编译Mosquitto以支持安卓平台时,主要涉及到使用Android NDK(Native Development Kit)进行交叉编译。环境的准备参考之前的博客【QT开发(17)】2023-QT 5.14.2实现Andr…...
大数据之数据抽取架构演变过程
架构演变之Flink架构的演变过程 一、 起初搭建整个大数据平台是基于CDH这一套资源管理和整合的CM资源管理器搭建的 整个平台包括了: HDFS,YARN,HIVE,zoozie,FLINK,Spark,Zookeeper等组件搭建而成, 刚开始搭建的时候&am…...
[web]-反序列化-绕过__wakeup(转)
BUUCTF-[极客大挑战 2019]PHP1_[极客大挑战 2019]php 1-CSDN博客 <?php include flag.php;error_reporting(0);class Name{private $username nonono;private $password yesyes;public function __construct($username,$password){$this->username $username;$this-…...
B树与B+树的区别
B树和B树都是用于数据库和文件系统的平衡树数据结构,但它们有一些显著的区别: 节点结构: B树:每个节点存储数据和指向子节点的指针。叶子节点也包含数据。 B树:内部节点只存储索引值,不存储实际数据。所有…...
机器人开源调度系统OpenTCS-6最新版本地源码运行
OpenTCS 项目使用 Gradle 而不是 Maven,那么需要使用 Gradle 来导入和构建项目。在 IntelliJ IDEA 中导入和运行使用 Gradle 的项目,可以按照以下步骤进行操作: 克隆 OpenTCS 源码 首先,克隆 OpenTCS 的源码到本地。您可以使用以…...
云监控(华为) | 实训学习day3(10)
实现数据的增删改查 SpringBoot框架模式 向送外卖一样理解 写程序 1、准备食材(java bean) 2、菜谱(pojo接口->预制->sql 语句) 3、service处理 4、controller 派送 5、用户请求->页面 一、Spring Boot实现增加 第一步:食材(表),用户增加,这里还是用户…...
springMVC前后端请求参数绑定和传递
目录 请求参数的绑定 当绑定参数是基本数据类型和字符串类型时,要注意: 当绑定参数是实体类型(JavaBean)要注意: 给集合属性数据封装,要注意: 绑定参数是日期类型,如何封装: 代码实例: 实体类1&#…...
【iOS】—— 消息传递和消息转发
【iOS】—— 消息传递和消息转发 1. 消息传递SEL选择子IMP快速查找汇编代码查找过程总结消息转送快速查找IMP 慢速查找总结消息传递慢速查找IMP 2. 消息转发动态决议动态解析添加方法 快速转发慢速转发 总结动态决议消息转发消息的三次拯救 1. 消息传递 在iOS中,消…...
【Node.js】初识 Node.js
Node.js 概念 Node.js 是一个开源与跨平台的 JavaScript运行时环境 ,在浏览器外运行 V8 JavaScript 引擎(Google Chrome的内核),利用事件驱动、非阻塞和异步输入输出 等技术提高性能。 可以理解为 Node.js就是一个服务器端的、非阻塞式 l/O 的、事件驱…...
AWS backup服务和 RDS snapshot的关系
首先,其实RDS的snapshot,自动备份和手动备份,就是调用的AWS backup服务,只不过是通过RDS控制台,API等等进行控制和管理的。 1. AWS backup 服务对于RDS的备份来说包括两部分: --连续备份(需要…...
PDF转Word怎么快速转换?格式转换技巧分享
PDF文件和Word文档是我们日常工作中不可或缺的文件格式,同时文件之间的格式转换也十分常见。不同的格式有着不同的优点,将PDF文件改为Word文档后,在编辑或修改文件内容时更为方便。 下面小编就来给大家介绍几种常用的PDF转Word的转换方法&am…...
浅谈:网络协议及网络连接
事情的起因 怪有意思的。(纯纯唠嗑,不感兴趣的可以跳过) 我们初中,在学期的最后一天换教室,由于我们是十三班,是年级里面的一个“例外”。因为我们其他年级都是12个和10个班级,就我们一个奇数…...
websocket-react使用
问题 在一个应用中,如果需要在不同的组件之间共享同一个WebSocket连接,可以采用多种方法来实现。 比如:单例模式、全局变量、react context React上下文(React Context) 如果你使用的是React,可以使用Re…...
【总结】nginx源码编译安装报错./configure: error: SSL modules require the OpenSSL library.
问题现象 源码编译安装nginx时,执行./configure …… --with-http_ssl_module 命令安装https模块,需要用到openssl,由于机器缺少openssl库,报如下错误。 …… checking for openat(), fstatat() ... found checking for getaddr…...
昇思25天学习打卡营第15天|两个分类实验
打卡 目录 打卡 实验1:K近邻算法实现红酒聚类 数据准备 模型构建--计算距离 计算演示 模型预测 实验2:基于MobileNetv2的垃圾分类 任务说明 数据集 参数配置(训练/验证/推理) 数据预处理 MobileNetV2模型搭建 Mobile…...
实践:Redis6.0配置文件解读
详细解读redis配置文件 https://raw.githubusercontent.com/redis/redis/6.2/redis.conf Units 配置数据单位换算关系配置大小单位:当需要内存大小时,可以指定。开头定义了一些基本的度量单位,只支持bytes,不支持bit࿰…...
【Go系列】Go语言的网络服务
承上启下 我们既然知道了Go语言的语法,也了解到了Go语言如何协同工作机制。那么对于这样一款天生支持高并发的语言,它的用武之地自然而然的就是网络服务了。我们今天学学如何使用网络服务。 开始学习 Go语言使用网络服务 在Go语言中,使用网…...
CS110L(Rust)
1.Rust 语法总结 数值类型 有符号整数: i8, i16, i32, i64无符号整数: u8, u16, u32, u64 变量声明 声明变量: let i 0; // 类型推断let n: i32 1; // 显式类型声明 可变变量: let mut n 0; n n 1; 字符串 注意,let s: str "Hello world";…...
seo网站运营/网站优化培训班
Hauntbox 是一个开源硬件控制器,能够满足用随意传感器和控制器建立复杂的、自己主动化的萦绕在心头的电子项目。 它不须要焊接或者预先学什么知识。是全然可控制、并与Arduino插板兼容。 无需编程,就用开源支持控制器,让你出没的地方及项目轻…...
网络招商平台网站怎么做/芭嘞seo
https://blog.csdn.net/wangpengzhi19891223/article/details/81197078 这篇文章总结了分布式主键或者唯一键的生成算法,文章最后有我们基于snowflow算法的思考和实践。 分布式主键的生成方式分为中心化和去中心化两大类。 中心化生成算法 中心化生成算法经典的方案…...
曰本真人性做爰网站午夜网站/百度大数据预测平台
Adobe Dreamweaver,简称“DW”,中文名称 "梦想编织者",最初为美国MACROMEDIA公司开发 ,2005年被Adobe公司收购。DW是集网页制作和管理网站于一身的所见即所得网页代码编辑器。利用对 HTML、CSS、JavaScript等内容的支持…...
做网站哪家公司便宜/站长工具免费
$("#selectid").get(0).options.add(new Option(json数据)) 转载于:https://www.cnblogs.com/DylanZ/p/11416057.html...
h5网站搭建/网络优化工程师是做什么的
困扰了半天,一直没找到如何在含有输入语句的情况下用pycharm进行断点调试(调试的同时进行输入交互), But 经过尝试,还是找到了~~~ 通过debug可以快速的找到报错信息,以及观察程序每步的运行步骤,…...
合肥网页网站制作/为企业推广
利用Servlet3.0能够轻松写出一个博客系统,主要是把数据存入数据库与从数据库读出数据怎么推向前台的问题。本章将会以一个博客系统来说明,如何利用JSTL表达式把Servlet从数据库读出的数据推向前台。将会利用网页文本格式编辑器xheditor与EL表达式基于Ser…...