【C/C++】C语言实现单链表
C语言实现单链表
- 简单描述
- 代码
- 运行结果
简单描述
- 用codeblocks编译通过
- 源码参考连接
https://gitee.com/IUuaena/data-structures-c.git
代码
- common.h
#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED#define ELEM_TYPE int //!< 链表元素类型/*! @brief 返回值类型 */
typedef enum
{OK, //!< 成功/正确NON_ALLOCATED, //!< 内存分配失败NON_EXISTENT, //!< 不存在ERROR //!< 错误
} status_t;#endif // COMMON_H_INCLUDED
- linked_list.h
#ifndef LINKED_LIST_H_INCLUDED
#define LINKED_LIST_H_INCLUDED#include "common.h"/*! @brief 链表结点 */
typedef struct linked_node
{ELEM_TYPE data; //!< 数据项struct linked_node* next; //!< 下一结点
} linked_node_t;typedef linked_node_t* linked_list_t; //!< 链表status_t LinkedListCreate(linked_node_t** linked_list_head, ELEM_TYPE* elements, int elem_count);status_t LinkedListGetElem(linked_node_t* linked_list_head, int pos, ELEM_TYPE* elem);status_t LinkedListInsert(linked_node_t* linked_list_head, int pos, ELEM_TYPE elem);status_t LinkedListDelete(linked_node_t* linked_list_head, int pos, ELEM_TYPE* elem);status_t LinkedListMergeTwoSortedList(linked_node_t* list_a_head,linked_node_t* list_b_head,linked_node_t** merged_list_head);void LinkedListPrint(linked_node_t* linked_list_head);#endif // LINKED_LIST_H_INCLUDED
- linked_list.c
/*!* @file linked_list.c* @author CyberDash计算机考研, cyberdash@163.com(抖音id:cyberdash_yuan)* @brief 单链表头文件* @version 1.0.0* @date 2022-07-10* @copyright Copyright (c) 2021* CyberDash计算机考研*/#include <stdlib.h>
#include <stdio.h>
#include "linked_list.h"/*!* @brief **链表创建*** @param linked_list_head **链表头结点**(指针)* @param elements **数据项数组*** @param elem_count **数据项数量*** @return **执行结果*** @note** 链表创建* -------* -------** - 链表头结点分配内存 \n*   **if** 内存分配失败 : \n*    返回NON_ALLOCATED \n* - 链表头节点next设置为NULL \n* - 遍历数据项数组并插入链表结点 \n*   **for loop** 遍历数据项数组(从后向前) : \n*    分配当前链表结点内存 \n*    **if** 内存分配失败 : \n*     返回NON_ALLOCATED \n*    当前数据项elements[i]赋给当前链表结点的data \n*    链表头的next指向当前链表结点 \n*/
status_t LinkedListCreate(linked_node_t** linked_list_head, ELEM_TYPE* elements, int elem_count)
{*linked_list_head = (linked_node_t*)malloc(sizeof(linked_node_t)); // 链表头结点分配内存if (!(*linked_list_head)){return NON_ALLOCATED;}(*linked_list_head)->next = NULL;for (int i = elem_count - 1; i >= 0; i--){linked_node_t* linked_node = (linked_node_t*)malloc(sizeof(linked_node_t)); // 新结点分配内存if (!linked_node){return NON_ALLOCATED;}linked_node->data = elements[i]; // elements[i]赋给新结点数据项linked_node->next = (*linked_list_head)->next; // 新结点next赋值(*linked_list_head)->next = linked_node; // linked_list_head->next指向新结点}return OK;
}/*!* @brief **链表获取某位置的结点数据*** @param linked_list_head **链表头结点**(指针)* @param pos **位置*** @param elem **保存结点数据项的变量**(指针)* @return **执行结果*** @note* 链表获取某位置的结点数据* ---------------------* ---------------------** - 初始化遍历指针cur和起始位置cur_post(从1开始, 区别于数组的从0开始) \n* - 遍历链表至位置pos \n*   **while** 未遍历至位置pos : \n*    cur指向后一个结点 \n*    cur_pos加1 \n* - 边界条件判断 \n* **if** 遍历指针cur指向NULL 或者 cur_pos大于pos : \n*   返回NON_EXISTENT(不存在该位置的元素) \n* - 将位置pos的元素的data赋给参数elem指向的变量*/
status_t LinkedListGetElem(linked_node_t* linked_list_head, int pos, ELEM_TYPE* elem)
{linked_node_t* cur = linked_list_head->next;int cur_pos = 1;while (cur && cur_pos < pos){cur = cur->next;cur_pos++;}// 位置pos的结点不存在, 返回NON_EXISTENTif (!cur || cur_pos > pos){return NON_EXISTENT;}*elem = cur->data; // 将位置pos的数据项赋给*elemreturn OK;
}/*!* @brief **链表插入*** @param linked_list_head **链表头结点**(指针)* @param pos **位置**(在这个位置前执行插入)* @param elem **待插入的数据项*** @return **执行结果*** @note* 链表插入* -------* -------** - 初始化指针cur和insert_pos_predecessor \n*   cur用来遍历, 找到插入位置的前一节点, insert_pos_predecessor用来找该节点的位置 \n* - 找到插入位置 \n*   **while** cur不为NULL 或者 尚未遍历完整个链表 \n*    cur指向下一个结点 \n*    insert_pos_predecessor加1 \n* - 处理没有插入位置的情况 \n*   **if** 插入位置不存在 \n*    返回ERROR \n* - 执行插入 \n*   分配结点内存 \n*   **if** 内存分配失败 : \n*    返回NON_ALLOCATED \n*   插入节点设置data和next \n*   cur->next指向插入节点 \n*/
status_t LinkedListInsert(linked_node_t* linked_list_head, int pos, ELEM_TYPE elem)
{linked_node_t* cur = linked_list_head;int insert_pos_predecessor = 0; // 插入位置的前一位置, 初始化为0// 遍历到插入位置的前一位置while(!cur || insert_pos_predecessor < pos - 1){cur = cur->next;insert_pos_predecessor++;}// 如果插入位置不存在, 返回ERRORif (!cur || insert_pos_predecessor > pos - 1){return ERROR;}// 插入结点分配内存linked_node_t* insert_node = (linked_node_t*)malloc(sizeof(linked_node_t));if (!insert_node){return NON_ALLOCATED;}// 插入节点设置data和nextinsert_node->data = elem;insert_node->next = cur->next;// cur->next指向插入节点cur->next = insert_node;return OK;
}/*!* @brief **链表删除结点*** @param linked_list_head **链表头结点**(指针)* @param pos **删除结点位置*** @param elem **被删除结点数据项的保存变量**(指针)* @return **执行结果*** @note* 链表删除结点* ----------* ----------* - 初始化变量delete_node_predecessor和delete_pos_predecessor \n*   delete_node_predecessor(删除节点的前一节点指针)指向表头 \n*   delete_pos_predecessor(删除节点的前一节点的位置)初始值为0 \n* - 遍历至被删除结点 \n* - 处理不存在删除结点的情况 \n* - 删除结点 \n*   指针delete_node指向delete_node_predecessor->next(被删除结点) \n*   delete_node_predecessor->next指向被删除结点的next \n*   被删除结点的数据项赋给item \n*   调用free释放被删除结点 \n*/
status_t LinkedListDelete(linked_node_t* linked_list_head, int pos, ELEM_TYPE* elem)
{linked_node_t* delete_node_predecessor = linked_list_head; // 待删除结点前一结点(指针), 初始化指向链表头结点int delete_pos_predecessor = 0; // 待删除结点前一结点的位置, 初始化为0// 遍历到待删除结点的前一结点while(!(delete_node_predecessor->next) || delete_pos_predecessor < pos - 1){delete_node_predecessor = delete_node_predecessor->next;delete_pos_predecessor++;}// 位置pos的结点不存在, 返回NON_EXISTENTif (!(delete_node_predecessor->next) || delete_pos_predecessor > pos - 1){return NON_EXISTENT;}linked_node_t* delete_node = delete_node_predecessor->next; // delete_node指向待删除结点delete_node_predecessor->next = delete_node->next;*elem = delete_node->data;free(delete_node); // 释放结点delete_node = NULL; // 避免野指针return OK;
}/*!* @brief **链表合并两个有序链表*** @param list_a_head **a链表的头结点**(指针)* @param list_b_head **b链表的头结点**(指针)* @param merged_list_head **合并链表的头结点**(二级指针)* @return **执行结果*** @note* 链表合并两个有序链表* -----------------* -----------------* **注**: 有序链表a和有序链表b合并, 合并至a链表 \n* - 初始化链表a的遍历指针a_cur和链表b的遍历指针b_cur \n*   a_cur指向链表a首元素结点 \n*   b_cur指向链表b首元素结点 \n* - 初始化合并链表的遍历指针 \n*   cur指向链表a头结点 \n* - 执行合并 \n*   **while** 链表a和链表b都未合并完 : \n*    **if** 链表a当前元素 <= 链表b当前元素 : \n*     合并链表当前元素(cur)的next指向链表a当前元素 \n*     合并链表当前元素(cur)更新为链表a当前元素 \n*     链表a当前元素向后移动一位(next) \n*    **else** (链表a当前元素 > 链表b当前元素) : \n*     合并链表当前元素(cur)的next指向链表a当前元素 \n*     合并链表当前元素(cur)更新为链表a当前元素 \n*     链表a当前元素向后移动一位(next) \n* - 剩余链表处理 \n*   如果链表a有剩余, 将链表a加到合并链表尾部 \n*   如果链表b有剩余, 将链表b加到合并链表尾部 \n*/
status_t LinkedListMergeTwoSortedList(linked_node_t* list_a_head,linked_node_t* list_b_head,linked_node_t** merged_list_head)
{linked_node_t* a_cur = list_a_head->next;linked_node_t* b_cur = list_b_head->next;*merged_list_head = list_a_head;linked_node_t* cur = list_a_head;while (a_cur && b_cur){if (a_cur->data <= b_cur->data){cur->next = a_cur;cur = a_cur;a_cur = a_cur->next;}else{cur->next = b_cur;cur = b_cur;b_cur = b_cur->next;}}if (a_cur){cur->next = a_cur;}if (b_cur){cur->next = b_cur;}return OK;
}/*!* @brief **打印链表*** @param linked_list_head **链表头结点*** @note* 打印链表* -------* -------* 遍历链表, 打印每一结点的数据项data \n*/
void LinkedListPrint(linked_node_t* linked_list_head)
{for (linked_node_t* cur = linked_list_head->next; cur != NULL; cur = cur->next){printf("%d ", cur->data);}printf("\n");
}
- main.c
#include <stdio.h>
#include <stdlib.h>
#include "linked_list.h"void TestLinkedListCreate() {printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("| 测试链表的创建 |\n");ELEM_TYPE arr[6] = { 1, 4, 2, 8, 5, 7 }; // 数据项数组linked_node_t* linked_list_head = NULL; // 链表头结点linked_list_head初始化为NULLprintf("创建链表: ");// 调用LinkedListCreate创建链表LinkedListCreate(&linked_list_head, arr, sizeof(arr)/ sizeof(ELEM_TYPE));// 打印链表LinkedListPrint(linked_list_head);printf("\n-------------------------------------------------------------\n\n");
}/*!* @brief **测试链表获取结点数据*** @note* 测试链表获取结点数据* -----------------* -----------------* - 创建链表 \n*   使用数组[1, 4, 2, 8, 5, 7]创建链表 \n* - 获取某位置结点数据 \n*   获取并打印 \n*/
void TestLinkedListGetElem() {printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("| 测试链表的获取元素 |\n");ELEM_TYPE arr[6] = { 1, 4, 2, 8, 5, 7 }; // 数据项数组linked_node_t* linked_list_head = NULL; // 链表头结点linked_list_head初始化为NULLprintf("创建链表: ");// 调用LinkedListCreate创建链表LinkedListCreate(&linked_list_head, arr, sizeof(arr) / sizeof(ELEM_TYPE));// 打印链表LinkedListPrint(linked_list_head);int pos = 3;ELEM_TYPE data;LinkedListGetElem(linked_list_head, pos, &data);printf("位置%d的结点, 数据项: %d\n", pos, data);printf("\n-------------------------------------------------------------\n\n");
}/*!* @brief **测试链表删除结点*** @note* 测试链表删除结点* --------------* --------------* - 创建链表 \n*   使用数组[1, 4, 2, 8, 5, 7]创建链表 \n* - 删除结点 \n* - 打印链表 \n*/
void TestLinkedListDelete() {printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("| 测试链表的删除结点 |\n");ELEM_TYPE arr[6] = { 1, 4, 2, 8, 5, 7 }; // 数据项数组linked_node_t* linked_list_head = NULL; // 链表头结点linked_list_head初始化为NULL// 调用LinkedListCreate创建链表printf("创建链表: ");LinkedListCreate(&linked_list_head, arr, sizeof(arr) / sizeof(ELEM_TYPE));// 打印链表LinkedListPrint(linked_list_head);int delete_pos = 4; // 删除结点位置ELEM_TYPE delete_node_elem = 0; // 被删除结点数据项的保存变量printf("\n删除位置%d的结点(从1开始计数)\n\n", delete_pos);LinkedListDelete(linked_list_head, delete_pos, &delete_node_elem);// 打印链表printf("删除结点后的链表: ");LinkedListPrint(linked_list_head);printf("\n-------------------------------------------------------------\n\n");
}/*!* @brief **测试链表插入结点*** @note* 测试链表插入结点* --------------* --------------* - 创建链表 \n*   使用数组[1, 4, 2, 8, 5, 7]创建链表 \n* - 插入结点 \n* - 打印链表 \n*/
void TestLinkedListInsert() {printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("| 测试链表的插入结点 |\n");ELEM_TYPE arr[6] = { 1, 4, 2, 8, 5, 7 }; // 数据项数组linked_node_t* linked_list_head = NULL; // 链表头结点linked_list_head初始化为NULL// 调用LinkedListCreate创建链表printf("创建链表: ");LinkedListCreate(&linked_list_head, arr, sizeof(arr) / sizeof(ELEM_TYPE));// 打印链表LinkedListPrint(linked_list_head);// 插入新元素LinkedListInsert(linked_list_head, 2, 9);LinkedListInsert(linked_list_head, 2, 10);LinkedListInsert(linked_list_head, 2, 11);// 打印链表printf("插入3个新结点后的链表: ");LinkedListPrint(linked_list_head);printf("\n-------------------------------------------------------------\n\n");
}/*!* @brief **测试链表有序链表合并*** @note** (有序)链表合并* ------------* ------------* - 创建链表1 \n*   2 --> 4 --> 6 --> 8 \n* - 创建链表2 \n*   1 --> 3 --> 5 --> 7 --> 9 --> 10 \n* - 合并链表 \n*   1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9 --> 10 \n*/
void TestLinkedListMerge() {printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("| 测试有序链表的合并 |\n");ELEM_TYPE elements1[4] = { 2, 4, 6, 8 };ELEM_TYPE elements2[6] = { 1, 3, 5, 7 , 9, 10};linked_node_t* linked_list_head1 = NULL;linked_node_t* linked_list_head2 = NULL;linked_node_t* merged_linked_list_head = NULL;printf("创建链表1:\n");LinkedListCreate(&linked_list_head1, elements1, sizeof(elements1) / sizeof(ELEM_TYPE));LinkedListPrint(linked_list_head1);printf("创建链表2:\n");LinkedListCreate(&linked_list_head2, elements2, sizeof(elements2) / sizeof(ELEM_TYPE));LinkedListPrint(linked_list_head2);printf("合并链表:\n");LinkedListMergeTwoSortedList(linked_list_head1, linked_list_head2, &merged_linked_list_head);LinkedListPrint(merged_linked_list_head);printf("\n-------------------------------------------------------------\n\n");
}int main()
{printf("你好!\n");TestLinkedListCreate();TestLinkedListGetElem();TestLinkedListDelete();TestLinkedListInsert();TestLinkedListMerge();return 0;
}
运行结果
你好!|------------------------ CyberDash ------------------------|
| 测试链表的创建 |
创建链表: 1 4 2 8 5 7-------------------------------------------------------------|------------------------ CyberDash ------------------------|
| 测试链表的获取元素 |
创建链表: 1 4 2 8 5 7
位置3的结点, 数据项: 2-------------------------------------------------------------|------------------------ CyberDash ------------------------|
| 测试链表的删除结点 |
创建链表: 1 4 2 8 5 7删除位置4的结点(从1开始计数)删除结点后的链表: 1 4 2 5 7-------------------------------------------------------------|------------------------ CyberDash ------------------------|
| 测试链表的插入结点 |
创建链表: 1 4 2 8 5 7
插入3个新结点后的链表: 1 11 10 9 4 2 8 5 7-------------------------------------------------------------|------------------------ CyberDash ------------------------|
| 测试有序链表的合并 |
创建链表1:
2 4 6 8
创建链表2:
1 3 5 7 9 10
合并链表:
1 2 3 4 5 6 7 8 9 10-------------------------------------------------------------
相关文章:
【C/C++】C语言实现单链表
C语言实现单链表 简单描述代码运行结果 简单描述 用codeblocks编译通过 源码参考连接 https://gitee.com/IUuaena/data-structures-c.git 代码 common.h #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDED#define ELEM_TYPE int //!< 链表元素类型/*! brief 返回值类…...
VBA数据库解决方案第九讲:把数据库的内容在工作表中显示
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...
蓝桥杯刷题-12-公因数匹配-数论(分解质因数)不是很理解❓❓
蓝桥杯2023年第十四届省赛真题-公因数匹配 给定 n 个正整数 Ai,请找出两个数 i, j 使得 i < j 且 Ai 和 Aj 存在大于 1 的公因数。 如果存在多组 i, j,请输出 i 最小的那组。如果仍然存在多组 i, j,请输出 i 最小的所有方案中 j 最小的那…...
机器视觉学习(十二)—— 绘制图形
目录 一、绘制函数参数说明 1.1 cv2.line()绘制直线 1.2 cv2.rectangle()绘制矩形 1.3 cv2.circle() 绘制圆形 1.4 cv2.ellipse()绘制椭圆 1.5 cv2.polylines()绘制…...
软考信息处理技术员2024年5月报名流程及注意事项
2024年5月软考信息处理技术员报名入口: 中国计算机技术职业资格网(http://www.ruankao.org.cn/) 2024年软考报名时间暂未公布,考试时间上半年为5月25日到28日,下半年考试时间为11月9日到12日。不想错过考试最新消息的…...
linux:du和df区别
文章目录 1. 概述2. du 命令2. df 命令3. 区别总结 1. 概述 du 和 df 都是 Linux 系统中用于查看磁盘空间使用情况的命令,但它们的功能和用法有所不同。 2. du 命令 du 是 “disk usage” 的缩写,用于显示文件或目录的磁盘使用情况。du 命令用于查看指…...
MacOS Docker 部署 Redis 数据库
一、简介 Redis是一个开源的、使用C语言编写的、基于内存亦可持久化的Key-Value数据库,它提供了多种语言的API,并支持网络交互。Redis的数据存储在内存中,因此其读写速度非常快,每秒可以处理超过10万次读写操作,是已知…...
个推助力小米汽车APP实现智能用户触达,打造智能出行新体验
4月3日,小米SU7首批交付仪式在北京亦庄的小米汽车工厂总装车间举行,全国28城交付中心也同步开启首批交付。随着小米SU7系列汽车的正式发售和交付,小米汽车APP迎来了用户体量的爆发式增长。 小米汽车APP是小米汽车官方推出的手机应用ÿ…...
科研 | SCI、SCIE、ESCI、JIF、IF、IEEE Fellow
文章目录 SCISCIESCIE和SCI的区别SCIE和ESCI的区别JIF和IF有什么不同吗?IEEE Fellow SCI 科学引文索引(Science Citation Index,SCI)是由Clarivate Analytics(原Thomson Reuters)维护的一个重要的学术引文…...
10倍提效!用ChatGPT编写系统功能文档。。。
系统功能文档是一种描述软件系统功能和操作方式的文档。它让开发团队、测试人员、项目管理者、客户和最终用户对系统行为有清晰、全面的了解。 通过ChatGPT,我们能让编写系统功能文档的效率提升10倍以上。 《Leetcode算法刷题宝典》一位阿里P8大佬总结的刷题笔记…...
【Linux进阶之路】地址篇
文章目录 一、ipv4地址1. 基本概念2. 分类3.CIDR4.特殊的ip地址 二、IP协议1. 协议字段2.分片与重组3.路由 三、NAT技术1.公有和私有2.NAT3.NAPT 四、ARP协议1.MAC地址2.ARP 五、DHCP协议六、DNS协议尾序 一、ipv4地址 1. 基本概念 概念:IP地址,英文全…...
代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和_哔哩哔…...
Rust线程间通信通讯channel的理解和使用
Channel允许在Rust中创建一个消息传递渠道,它返回一个元组结构体,其中包含发送和接收端。发送端用于向通道发送数据,而接收端则用于从通道接收数据。不能使用可变变量的方式,线程外面修改了可变变量的值,线程里面是拿不…...
Vue3组件基础示例
组件是vue中最推崇的,也是最强大的功能之一,就是为了提高重用性,减少重复性的开发。 如何使用原生HTML方法实现组件化 在使用原生HTML开发时,我们也会遇到一些常见的功能、模块,那么如何在原生HTML中使用组件化呢&am…...
如何使用PL/SQL Developer工具导出clob字段的表?
1 准备测试数据 导出测试对象:表test_0102,others字段为clob类型 --创建中间表test_0101 create table test_0101( id number, name varchar2(20), others clob);--插入100条测试数据 beginfor i in 1..100 loopinsert into test_0101 values(i,i||_a,l…...
蓝桥杯刷题 深度优先搜索-[NewOJ P1158]N皇后(C++)
题目描述 n皇后问题:n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 上面布局用序列2 4 6 1 3 5表示,第i个数字表示第i行皇后放的列号。 按照这种格式输出前3个解,并统计总解数。 输入格式 输入一个正整数n&a…...
python实例2.2:编写一个装饰器,计算任何一个函数执行的时间(详解及其知识点拓展)
目录 一、编写一个装饰器,计算任何一个函数执行的时间 二、装饰器详解,及其用法举例...
Jenkins 持续集成 【CICD】
持续集成 (Continuous integration,简称CI) 持续集成是一种开发实践,它倡导团队成员频繁的集成他们的工作,每次集成都通过自动化构建(包括编译、构建、打包、部署、自动化测试)来验证ÿ…...
【CHI】(十二)Memory Tagging
目录 1. Introduction 2. Message extensions 3. Tag coherency 4. Read transaction rules 4.1 TagOp values 4.2 Permitted initial MTE tag states 5. Write transactions 5.1 Permitted TagOp values 5.2 TagOp, TU, and tags relationship 6. Dataless transact…...
Vue - 你知道Vue组件之间是如何进行数据传递的吗
难度级别:中级及以上 提问概率:85% 这道题还可以理解为Vue组件之间的数据是如何进行共享的,也可以理解为组件之间是如何通信的,很多人叫法不同,但都是说的同一个意思。我们知道,在Vue单页面应用项目中,所有的组件都是被嵌套在App.vue内…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
