解锁C/C++:链表数据结构的奇幻之旅
目录
- 一、引言
- 二、链表基础概念
- 2.1 链表是什么
- 2.2 链表的类型
- 三、C 语言实现链表
- 3.1 定义链表节点
- 3.2 创建链表
- 3.3 链表操作
- 3.3.1 遍历链表
- 3.3.2 插入节点
- 3.3.3 删除节点
- 3.3.4 查找节点
- 3.4 完整示例代码
- 四、C++ 实现链表
- 4.1 定义链表节点类
- 4.2 创建链表
- 4.3 链表操作
- 4.3.1 遍历链表
- 4.3.2 插入节点
- 4.3.3 删除节点
- 4.3.4 查找节点
- 4.4 完整示例代码
- 五、链表的应用场景
- 5.1 实现队列
- 5.2 实现栈
- 5.3 实现哈希表
- 5.4 其他应用
- 六、总结
一、引言
在数据结构的广阔领域中,链表作为一种基础且重要的数据结构,占据着不可或缺的地位。链表是一种线性表,但其与数组这种线性表有着显著的区别,链表中的元素在内存中并非连续存储,而是通过指针将各个节点串联起来,这种独特的存储方式赋予了链表在某些操作上的高效性和灵活性。
链表在计算机科学的众多领域都有着广泛的应用。
- 在操作系统中,链表常被用于管理内存分配,通过链表可以有效地跟踪和分配内存块,实现动态内存管理,提高内存的利用率;
- 在文件系统里,链表可以用来表示文件的目录结构,方便文件的查找和管理;
- 在各种算法实现中,链表也是重要的基础,例如在实现栈和队列等数据结构时,链表能够提供高效的插入和删除操作,使得这些数据结构的实现更加简洁和高效 。
C 和 C++ 语言作为强大的编程语言,在实现链表方面具有独特的优势。
- C 语言提供了指针这一强大的工具,使得我们能够直接操作内存地址,从而方便地实现链表节点之间的连接和操作。通过指针,我们可以灵活地分配和释放内存,创建、插入、删除和遍历链表节点。
- 而 C++ 语言在 C 语言的基础上,进一步引入了类和对象的概念,使得链表的实现更加面向对象化,代码的封装性、可读性和可维护性更强。我们可以将链表的操作封装在一个类中,通过类的成员函数来实现链表的各种功能,这样可以更好地组织代码,提高代码的复用性。
在 C 和 C++ 中实现链表,不仅能够深入理解链表这种数据结构的原理和机制,还能锻炼我们对指针、内存管理等重要编程概念的掌握和运用能力。无论是对于学习数据结构和算法的初学者,还是对于有一定编程经验的开发者来说,通过 C 和 C++ 实现链表都是一项非常有价值的实践。它能够帮助我们提升编程技能,培养解决问题的能力,为进一步学习和应用更复杂的数据结构和算法打下坚实的基础。
二、链表基础概念
2.1 链表是什么
链表是一种线性数据结构,它由一系列节点(nodes)组成。每个节点包含两个主要部分:数据域和指针域。数据域用于存储数据元素,而指针域则存储着下一个节点的内存地址,通过指针将各个节点按顺序连接起来,形成一个链式结构 。链表与数组都是线性表,但它们在存储方式和访问方式上有着显著的区别。
在存储方式上,数组在内存中占据连续的存储空间,例如,当我们定义一个包含 5 个整数的数组int arr[5]时,系统会在内存中分配一块连续的、足以容纳 5 个整数的空间来存储这些元素。而链表中的节点在内存中并不要求连续存储,它们可以分散在内存的不同位置,通过指针来建立逻辑上的顺序关系。比如,有三个节点 A、B、C,节点 A 的指针指向节点 B 的内存地址,节点 B 的指针又指向节点 C 的内存地址,这样就形成了一个简单的链表结构,即使 A、B、C 在内存中的实际存储位置并不相邻,也不影响它们通过指针构成链表。
在访问方式上,数组支持随机访问,我们可以通过数组的索引(下标)直接快速地访问到数组中的任何元素。例如,对于数组arr,我们可以使用arr[2]直接访问到数组中的第 3 个元素(数组索引从 0 开始),这种访问方式的时间复杂度为 ,因为无论数组有多大,通过索引访问元素的时间几乎是固定的。而链表不支持随机访问,如果要访问链表中的某个元素,通常需要从头节点开始,沿着指针逐个遍历,直到找到目标节点。例如,要访问链表中第 n 个节点,需要从第一个节点开始,依次通过指针访问下一个节点,直到到达第 n 个节点,这个过程的时间复杂度为 ,其中 n 是链表的长度,链表越长,访问特定节点所需的时间就越长。
2.2 链表的类型
链表根据其结构特点可以分为单向链表、双向链表和循环链表,它们在结构和功能上各有特点。
单向链表是最简单的链表形式,每个节点只包含一个指针,该指针指向下一个节点。在单向链表中,表头指针指向第一个节点,而最后一个节点的指针则为空(通常用 NULL 表示),表示链表的结束。例如,我们有一个单向链表,包含节点 1、节点 2、节点 3,节点 1 的指针指向节点 2,节点 2 的指针指向节点 3,节点 3 的指针为 NULL。单向链表的优点是结构简单,实现容易,占用的内存空间相对较小,因为每个节点只需要存储一个指针。但是它也有明显的缺点,由于只能从前往后遍历,若要访问某个节点的前驱节点(前一个节点),则需要从头开始重新遍历链表,这在某些情况下会导致效率较低。 如在实现一个文本编辑功能时,使用单向链表存储文本内容,当用户需要将光标向上移动一行(即访问前一个节点)时,就需要从链表的头部开始,逐个节点遍历,直到找到前一个节点,这会消耗较多的时间。
双向链表在单向链表的基础上,每个节点增加了一个指向前驱节点的指针。这样,双向链表中的每个节点都有两个指针,一个指向前一个节点,另一个指向后一个节点。表头指针指向第一个节点,表尾指针指向最后一个节点,并且第一个节点的前驱指针和最后一个节点的后继指针都可以根据需要进行设置,通常在双向循环链表中,第一个节点的前驱指针指向最后一个节点,最后一个节点的后继指针指向第一个节点。双向链表的优势在于可以双向遍历链表,大大提高了某些操作的效率。例如,在实现一个双端队列时,使用双向链表可以方便地在队列的两端进行插入和删除操作,因为可以直接通过指针访问到前一个和后一个节点,而不需要像单向链表那样从头遍历。在需要频繁进行插入和删除操作,特别是在已知节点位置的情况下,双向链表的操作效率更高。但双向链表的缺点是每个节点需要额外存储一个指针,因此会占用更多的内存空间,空间复杂度相对较高。
循环链表的特点是链表的尾节点的指针不再指向 NULL,而是指向头节点,从而形成一个闭环。在循环链表中,从任何一个节点出发,都可以遍历到链表中的所有节点,因为链表没有真正的结束点。循环链表又可以分为单向循环链表和双向循环链表。单向循环链表中,节点之间的连接方向是单向的,只能沿着一个方向循环遍历;双向循环链表则结合了双向链表和循环链表的特点,节点可以双向循环遍历。例如,在实现一个循环播放列表时,就可以使用循环链表来存储歌曲信息,当播放到最后一首歌曲时,通过循环链表的特性,可以直接跳转到第一首歌曲继续播放,实现无缝循环播放的效果。循环链表在一些需要循环操作的场景中非常有用,比如操作系统中的进程调度,就可以使用循环链表来管理进程,按照一定的顺序依次调度每个进程,当所有进程都调度一遍后,又回到第一个进程继续调度。
三、C 语言实现链表
3.1 定义链表节点
在 C 语言中,通常使用结构体来定义链表节点。以下是一个简单的单向链表节点定义示例:
// 定义链表节点结构体
typedef struct Node {int data; // 数据域,这里假设存储整数,可根据实际需求修改struct Node* next; // 指针域,指向下一个节点
} Node;
在这段代码中,typedef关键字用于为结构体struct Node定义一个别名Node,这样在后续代码中可以更方便地使用Node来声明节点变量。结构体Node包含两个成员:data用于存储数据,next是一个指向struct Node类型的指针,用于指向下一个节点,从而构建链表的链式结构。
3.2 创建链表
创建链表的过程通常包括初始化头节点,以及向链表中添加节点。常见的添加节点方法有头插法和尾插法。
初始化头节点是创建链表的第一步,代码如下:
Node* createList() {Node* head = (Node*)malloc(sizeof(Node));if (head == NULL) {printf("内存分配失败\n");return NULL;}head->next = NULL; // 初始化头节点的指针域为NULL,表示链表为空return head;
}
上述代码中,createList函数使用malloc函数为头节点分配内存空间,如果内存分配失败,打印错误信息并返回NULL。成功分配内存后,将头节点的next指针设置为NULL,表示这是一个空链表,最后返回头节点指针。
头插法是将新节点插入到链表头部的方法,代码实现如下:
void insertAtHead(Node* head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败\n");return;}newNode->data = data;newNode->next = head->next; // 新节点的next指针指向原头节点的下一个节点head->next = newNode; // 头节点的next指针指向新节点,新节点成为新的头节点
}
在insertAtHead函数中,首先为新节点分配内存,若分配失败则打印错误信息并返回。然后将新节点的数据设置为传入的data,接着让新节点的next指针指向原头节点的下一个节点,最后更新头节点的next指针,使其指向新节点,这样新节点就被插入到了链表的头部。
尾插法是将新节点插入到链表尾部的方法,代码实现如下:
void insertAtTail(Node* head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败\n");return;}newNode->data = data;newNode->next = NULL;Node* current = head;while (current->next!= NULL) {current = current->next; // 找到链表的最后一个节点}current->next = newNode; // 将新节点插入到链表的尾部
}
在insertAtTail函数中,同样先为新节点分配内存,若失败则处理错误。将新节点的数据设置好并将其next指针置为NULL。然后通过一个循环找到链表的最后一个节点(即当前节点的next指针为NULL的节点),最后将最后一个节点的next指针指向新节点,完成新节点在链表尾部的插入。
3.3 链表操作
3.3.1 遍历链表
遍历链表是指依次访问链表中的每个节点。通过一个指针从链表的头节点开始,沿着next指针逐个移动,直到指针为NULL,表示到达链表末尾。以下是遍历链表并打印每个节点数据的代码:
void traverseList(Node* head) {Node* current = head->next; // 跳过头节点,因为头节点可能不存储实际数据while (current!= NULL) {printf("%d ", current->data); // 打印当前节点的数据current = current->next; // 移动到下一个节点}printf("\n");
}
在traverseList函数中,定义了一个current指针,初始化为头节点的下一个节点(如果头节点存储实际数据,则可从head开始)。在循环中,不断打印当前节点的数据,并将current指针移动到下一个节点,直到current为NULL,此时遍历结束,打印换行符。
3.3.2 插入节点
在指定位置插入节点需要先找到插入位置的前一个节点,然后调整指针完成插入。假设要在第pos个位置插入节点(从 1 开始计数),代码实现如下:
void insertAtPosition(Node* head, int data, int pos) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败\n");return;}newNode->data = data;Node* current = head;int i;for (i = 1; i < pos && current->next!= NULL; i++) {current = current->next; // 找到插入位置的前一个节点}if (i == pos) {newNode->next = current->next; // 新节点的next指针指向当前节点的下一个节点current->next = newNode; // 当前节点的next指针指向新节点} else {printf("插入位置无效\n");free(newNode); // 释放分配的内存}
}
在insertAtPosition函数中,首先为新节点分配内存,若失败则处理错误。然后通过一个循环找到插入位置的前一个节点(如果pos超过链表长度,则current会指向链表末尾)。如果找到了正确的插入位置(i等于pos),则调整指针将新节点插入到链表中;如果插入位置无效(i不等于pos且current已经到达链表末尾),则打印错误信息并释放新节点分配的内存。
3.3.3 删除节点
删除指定节点需要找到要删除节点的前一个节点,调整指针跳过要删除的节点,并释放被删除节点的内存。假设要删除第pos个节点(从 1 开始计数),代码实现如下:
void deleteNode(Node* head, int pos) {Node* current = head;Node* temp;int i;for (i = 1; i < pos && current->next!= NULL; i++) {current = current->next; // 找到要删除节点的前一个节点}if (i == pos && current->next!= NULL) {temp = current->next; // 保存要删除的节点current->next = temp->next; // 前一个节点的next指针指向要删除节点的下一个节点free(temp); // 释放要删除节点的内存} else {printf("删除位置无效\n");}
}
在deleteNode函数中,通过循环找到要删除节点的前一个节点。如果找到了正确的位置且当前节点的下一个节点存在(即要删除的节点存在),则保存要删除的节点,调整前一个节点的next指针跳过要删除的节点,最后释放要删除节点的内存;如果删除位置无效(i不等于pos或者current已经到达链表末尾且未找到要删除的节点),则打印错误信息。
3.3.4 查找节点
查找特定数据的节点,需要从链表头节点开始,逐个比较节点的数据,直到找到目标节点或遍历完整个链表。以下是查找节点的代码:
Node* searchNode(Node* head, int data) {Node* current = head->next;while (current!= NULL) {if (current->data == data) {return current; // 找到目标节点,返回节点指针}current = current->next; // 继续查找下一个节点}return NULL; // 未找到目标节点,返回NULL
}
在searchNode函数中,从链表的头节点的下一个节点开始遍历链表。在循环中,每次比较当前节点的数据是否等于目标数据data,如果相等,则返回当前节点的指针,表示找到了目标节点;如果遍历完整个链表都未找到目标数据,则返回NULL。
3.4 完整示例代码
下面是一个完整的 C 语言链表操作示例,包含上述所有功能:
相关文章:
解锁C/C++:链表数据结构的奇幻之旅
目录 一、引言二、链表基础概念2.1 链表是什么2.2 链表的类型三、C 语言实现链表3.1 定义链表节点3.2 创建链表3.3 链表操作3.3.1 遍历链表3.3.2 插入节点3.3.3 删除节点3.3.4 查找节点3.4 完整示例代码四、C++ 实现链表4.1 定义链表节点类4.2 创建链表4.3 链表操作4.3.1 遍历链…...
x64、aarch64、arm与RISC-V64:详解四种处理器架构
x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…...
nuxt3中报错: `setInterval` should not be used on the server.
那是因为在后端渲染没有浏览器的执行环境,一些浏览器环境提供的对象和方法都无法使用,代码判断下就行。 if (import.meta.client) {setInterval(() > {}, 1000) }Import meta Nuxt API...
python编程-集合内置函数和filter(),集合常见操作
在Python中,列表、集合、字典是三种常用的数据结构,它们各自拥有一些内置函数,用于执行各种操作。 一、列表的常用内置函数 #1、append(obj): 在列表末尾添加新的对象。list_a [1, 2, 3] list_a.append(4) print(list_a) # 输出: [1,…...
三极管的截止、放大、饱和区
三极管的几个区,都有什么用: 截止区:晶体管不导通,用于开关电路的“关”状态。 放大区:晶体管用于信号放大,集电极电流与基极电流成正比。 饱和区:晶体管完全导通,用于开关电路的“…...
python爬虫--简单登录
1,使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…...
苹果公司宣布正式开源 Xcode 引擎 Swift Build145
2025 年 2 月 1 日,苹果公司宣布正式开源 Xcode 引擎 Swift Build145。 Swift 是苹果公司于 2014 年推出的一种开源编程语言,用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 等平台的应用程序。 发展历程 诞生:2014 年,苹果在全球…...
齿轮减速机和平行轴减速机有何区别?
减速机是传动系统中重要的组成部分,常用的减速机有四大系列,分别是平行轴减速机、同轴减速机、直角减速机和齿轮减速机。那么大家知道齿轮减速机和平行轴减速机投什么区别吗? 齿轮减速机的轴不一定是平行的,还可能存在相交轴或交错…...
基于Hexo实现一个静态的博客网站
原文首发:https://blog.liuzijian.com/post/8iu7g5e3r6y.html 目录 引言1.初始化Hexo2.整合主题Fluid3.部署评论系统Waline4.采用Nginx部署 引言 Hexo是中国台湾开发者Charlie在2012年创建的一个开源项目,旨在提供一个简单、快速且易于扩展的静态博客生…...
MIT6.824 Lecture 1-Introduction
balance:性能和容错 Faulty tolerance: Availablity、Recoverability、NV storage(非易失性存储,比较贵)、Replication(多个数据副本) consistency: Put(key,…...
【Redis实战】投票功能
1. 前言 现在就来实践一下如何使用 Redis 来解决实际问题,市面上很多网站都提供了投票功能,比如 Stack OverFlow 以及 Reddit 网站都提供了根据文章的发布时间以及投票数计算出一个评分,然后根据这个评分进行文章的展示顺序。本文就简单演示…...
1Panel应用推荐:WordPress开源博客软件和内容管理系统
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...
GGML、GGUF、GPTQ 都是啥?
GGML、GGUF和GPTQ是三种与大型语言模型(LLM)量化和优化相关的技术和格式。它们各自有不同的特点和应用场景,下面将详细解释: 1. GGML(GPT-Generated Model Language) 定义:GGML是一种专为机器学习设计的张量库,由Georgi Gerganov创建。它最初的目标是通过单一文件格式…...
MySQL主从复制原理及工作过程
一、主从复制原理 1、MySQL将数据变化记录到二进制日志中; 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中; 3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库 详细步骤&…...
Unity VideoPlayer播放视屏不清晰的一种情况
VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。...
发布:大彩科技DN系列2.8寸高性价比串口屏发布!
一、产品介绍 该产品是一款2.8寸的工业组态串口屏,采用2.8寸液晶屏,分辨率为240*320,支持电阻触摸、电容触摸、无触摸。可播放动画,带蜂鸣器,默认为RS232通讯电平,用户短接屏幕PCB上J5短接点即可切换为TTL电…...
Oh3.2项目升级到Oh5.0(鸿蒙Next)具体踩坑记录(一)
目录 1.自动修复部分 Cause: The project structure and configuration require an upgrade. Solution: 1. Use Migrate Assistant to auto-upgrade the project structure and configuration. 2. Manually upgrade the project structure and configuration by following th…...
pytest+request+yaml+allure 接口自动化测试全解析[手动写的跟AI的对比]
我手动写的:Python3:pytest+request+yaml+allure接口自动化测试_request+pytest+yaml-CSDN博客 AI写的:pytest+request+yaml+allure 接口自动化测试全解析 在当今的软件开发流程中,接口自动化测试扮演着至关重要的角色。它不仅能够提高测试效率,确保接口的稳定性和正确性…...
Redis存储⑤Redis五大数据类型之 List 和 Set。
目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...
使用PyCharm进行Django项目开发环境搭建
如果在PyCharm中创建Django项目 1. 打开PyCharm,选择新建项目 2.左侧选择Django,并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一: 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…...
C# 综合运用介绍
.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种由微软开发的面向对象编程语言,在软件开发领域占据着重要地位。凭借其简洁、类型安全以及与.NET 框架的紧密结合等特性,C# 被广泛应用于多个领域。下面将详细介绍 C# 的综合运用。 一、C# 语言特性…...
Docker 和 Docker Compose
Docker 和 Docker Compose 是两个相关但用途不同的工具,它们在容器化应用的管理和部署中扮演不同的角色。以下是它们的核心区别: 1. 功能定位 Docker: 是一个容器化平台,用于创建、运行和管理单个容器。适用于单个容器应用的开发和测试。通过…...
文件上传到腾讯云存储、签名及设置过期时间
将文件上传到腾讯云对象存储(COS,Cloud Object Storage)可以通过腾讯云提供的 SDK 实现。以下是详细的步骤和示例代码,帮助您完成文件上传操作。 步骤 注册腾讯云账号并创建存储桶: (1)登录腾讯…...
从0开始达芬奇(6)
软件交互 就是与PR,AE软件进行交互。(这个就不多说啦) 快捷键(以下是TIM总结的常用快捷键)...
如何在Windows上使用Docker
引言 WSL2(Windows Subsystem for Linux2)是微软开发的一种技术,允许在 Windows 操作系统上运行 Linux 环境。它提供了一个兼容层,使得用户可以在 Windows 系统中直接运行 Linux 命令行工具、应用程序和开发工具,而无需…...
细胞计数专题 | 如何减少台盼蓝沉淀?
台盼蓝(Trypan Blue)是一种在生物学研究中广泛使用的染料,尤其常用于细胞活力检测。当细胞死亡时,其细胞膜会变得对台盼蓝具有通透性,染料因而能够进入细胞并与细胞内的蛋白质结合,产生染色效果。由此&…...
go流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。 Go 语言中最常用的流程控制有 if 和 for,而 switch 和 goto 主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。 if else…...
Spring Web MVC项目的创建及使用
一、什么是Spring Web MVC? Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中,通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构…...
RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)
#作者:闫乾苓 系列前几篇: 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》:link 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)》: lin…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
声明 就在 main函数所在的 nginx.c 中: static ngx_int_t ngx_get_options(int argc, char *const *argv); 实现 static ngx_int_t ngx_get_options(int argc, char *const *argv) {u_char *p;ngx_int_t i;for (i 1; i < argc; i) {p (u_char *) argv[i]…...
TCP长连接、HTTP短轮询、HTTP长轮询、HTTP长连接、WebSocket的区别
1.TCP长连接 (1)概念:该连接属于传输层的协议。客户端和服务器之间建立连接后,不立即断开该连接,而是一直保持这个状态,以便后续数据的持续、连续传输。(2)应用场景:适合…...
在 Flownex 中创建自定义工作液
在这篇博文中,我们将了解如何在 Flownex 中为流网添加和定义一种新的流体温度相关工作材料。 Flownex 物料管理界面 在 Flownex 中使用与温度相关的流体材料时,了解其特性与温度的关系非常重要。这种了解可确保准确预测各种热条件下的流体行为࿰…...
基于Spring Boot的图书个性化推荐系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【抽象代数】1.1. 运算及关系
集合与映射 定义1. 设 为 的子集,定义 到 的映射 : 使得 ,称 为 到 的嵌入映射。 定义2. 设 为 的子集, 为 到 的映射, 为 到 的映射,如果 ,称为的开拓, 为 的限制&…...
拥抱开源,助力创新:IBM永久免费云服务器助力开源项目腾飞
近年来,开源项目蓬勃发展,为全球科技进步做出了巨大贡献。然而,服务器成本高昂常常成为开源项目的巨大障碍。许多优秀的项目因缺乏资源而难以持续发展,甚至夭折。令人振奋的是,IBM云计算平台推出了一项重磅活动&#x…...
Windows Docker笔记-简介摘录
Docker是一个开源的容器化平台,可以帮助开发人员将应用程序与其依赖项打包在一个独立的容器中,然后在任何安装的Docker的环境中快速、可靠地运行。 几个基本概念和优势: 1. 容器 容器是一个轻量级、独立的运行环境,包含了应用程…...
threejs 建筑设计(室内设计)软件 技术调研之五 墙体生成后自动生成房间(地面)
运用threejs 开发 建筑设计(室内设计)软件 技术调研 四 墙体添加真实门窗并保持原材质 在线体验地址:http://47.96.130.245:8080/design/index.html 实现功能: 墙体材质变换后,自动根据墙体的顶点生成相应的房间 视…...
C++:string类的模拟实现
目录 1.引言 2.C模拟实现 2.1模拟实现构造函数 1)直接构造 2)拷贝构造 2.2模拟实现析构函数 2.3模拟实现其他常规函数 1)c_str函数 2)size函数 3)begin/end函数 4)reserve函数 5)re…...
UE制作2d游戏
2d免费资产: Free 2D Game Assets - CraftPix.net 需要用到PaperZD插件 官网下载后启用即可 导入png素材 然后全选 - 创建Sprite 创建 人物基类 设置弹簧臂和相机 弹簧臂设置成旋转-90 , 取消碰撞测试 设置子类Sprite 拖到场景中 绑定设置输入映射,让角色移动跳跃 神似卡拉比…...
verilog练习:i2c slave 模块设计
文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了,网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总,如果对读者有…...
mysql的语句备份详解
使用mysqldump工具备份(适用于逻辑备份) mysqldump是 MySQL 自带的一个非常实用的逻辑备份工具,它可以将数据库中的数据和结构以 SQL 语句的形式导出到文件中。 1. 备份整个数据库 mysqldump -u [用户名] -p [数据库名] > [备份文件名].…...
BFS算法篇——广度优先搜索,探索未知的旅程(上)
文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索(BFS)是一种广泛应用于图论中的算法,常用于寻找最短路径、图的遍历等问题。与深度优先搜索(DFS&…...
短剧APP开发:短剧风口下的机遇
今年春节以来,各种精品短剧不断上线,短剧赛道热度持续上升,展现出了强大的经济效益,为影视市场提供了越来越多的机会。短剧的持续火爆也带动了短剧APP的发展,“短剧”迎来了爆发式增长,本文将探讨短剧APP开…...
PT2021K 单触控同步输出 IC
1. 产品概述 PT2021K 是一款电容式触摸控制 ASIC ,支持 1 通道触摸输入, 1 通道同步型开关输出。具有低 功耗、高抗干扰、宽工作电压范围、高穿透力的突出优势。 2. 主要特性 工作电压范围: 2.4~5.5V 待机电流约 9uAV DD 5V&…...
[论文笔记] Deepseek-R1R1-zero技术报告阅读
启发: 1、SFT&RL的训练数据使用CoT输出的格式,先思考再回答,大大提升模型的数学与推理能力。 2、RL训练使用群体相对策略优化(GRPO),奖励模型是规则驱动,准确性奖励和格式化奖励。 1. 总体概述 背景与目标 报告聚焦于利用强化学习(RL)提升大型语言模型(LLMs)…...
选择LabVIEW开发外协还是自己做开发?
在决定是否选择外协进行LabVIEW开发时,选择合适的外协团队是至关重要的。一个专业的外协团队不仅能提高项目的开发效率,还能帮助解决技术难题,确保项目的高质量交付。在选择团队时,以下几个方面值得特别注意: 1. 团…...
网络工程师 (20)计算机网络的概念
一、定义 计算机网络是指将地理位置不同、具有独立功能的多台计算机及其外部设备,通过通信线路及通信设备连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现信息传递和资源共享的计算机通信系统。 二、组成 资源子网&…...
RockyLinux9.4安装教程
Rocky Linux 9.4 安装教程 Rocky Linux 是由 CentOS 创始人 Gregory Kurtzer 发起的一个社区企业操作系统,旨在与 Red Hat Enterprise Linux (RHEL) 保持二进制兼容。本教程将详细介绍如何在您的系统上安装 Rocky Linux 9.4。 步骤 1: 下载 Rocky Linux 9.4 ISO 文件 打开 R…...
单片机之基本元器件的工作原理
一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件,具有单向导电性。 1. PN结形成 P型半导体:掺入三价元素,形成空穴作为多数载流子。N型半导体:掺入五价元素,形成自由电子作为多…...
TOTP实现Google Authenticator认证工具获取6位验证码
登录遇到Google认证怎么办? TOTP是什么?(Google Authenticator) TOTP(Time-based One-Time Password)是一种基于时间的一次性密码算法,主要用于双因素身份验证。其核心原理是通过共享密钥和时间同步生成动态密码,具体步骤如下: 共享密钥:服务端与客户端预先共享一个…...