数据结构-单链表
文章目录
- 一、单链表的概念及结构
- 1.链表的概念
- 2.链表的节点结构
- 3.单链表增删查改操作的实现
一、单链表的概念及结构
1.链表的概念
🍉🍉概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
(1) 链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增加几节。只需要将火车里的某节车厢去掉/加上,不会影响其他车厢,每节车厢都是独立存在的。
(2) 车厢是独立存在的,且每节车厢都有车门。想象这样一个场景,假设每节车厢的车门都是锁上的状态,需要不同的钥匙才能解锁,每次只能携带一把钥匙的情况下如何从车头走到车尾? 最简单的做法就是:每节车厢里都放一把下一节车厢的钥匙🔑。
那在链表里,每节"车厢"是什么样的呢?
与顺序表不同的是,链表里的每节"车厢"都是独立申请下来的空间,我们称之为"结点/节点"。节点的组成主要有两个部分:当前节点要保存的数据和保存下一个节点的地址。图中指针变量 plist 保存的是第一个节点的地址,我们称plist此时"指向"第一个节点。如果我们希望plist"指向"第二个节点时,只需要修改plist保存的内容为0x0012FFA0即可。(链表是由一个一个的节点组成的)
为什么还需要指针变量来保存下一个节点的位置呢?
答:链表中每个节点都是独立申请的(即需要插入数据时才去申请一块节点的空间),🔑🔑🔑我们需要通过指针变量来保存下一个节点的地址才能从当前节点找到下一个节点。
2.链表的节点结构
学到这里就知道了应该用结构体来描述一个节点。一个节点中既要有保存的数据还要有下一个节点的指针,那我们就可以给出节点的结构。假设节点保存的数据为整型:【注:本节讲的是单链表(single linked list),节点的英文单词为node】
//定义节点的结构
typedef int SLTDataType;
struct SListNode
{SLTDataType data; //节点数据struct SListNode* next; //指针变量用来保存下⼀个节点的地址
};
当我们想要保存一个整型数据时,实际是向操作系统申请了一块内存,这个内存不仅要保存整型数据,也需要保存下一个节点的地址(当下一个节点为空时保存的地址为NULL)。如果我们想要从第一个节点走到最后一个节点时,只需要在前一个节点拿上 下一个节点的地址(下一个节点的钥匙)就可以了。
3.单链表增删查改操作的实现
知道了链表就是由一个一个的节点组成的,接下来就是链表的增删查改等操作方法的实现。我们将节点的结构定义及单链表各种方法的声明放在SList.h的头文件中,将方法的实现放在SList.c的源文件中,最后再创建一个test.c的源文件用来测试单链表的各种操作方法。
//SList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//定义节点的结构
typedef int SLTDataType;
//数据+指向下一个节点的指针
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;
//打印链表中的数据
void SLTPrint(SLTNode* phead);//链表尾插节点
void SLTPushBack(SLTNode** pphead, SLTDataType x);//链表头插节点
void SLTPushFront(SLTNode** pphead, SLTDataType x);//链表的尾删
void SLTPopBack(SLTNode** pphead);//链表的头删
void SLTPopFront(SLTNode** pphead);//链表数据的查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);//在指定位置之前插入数据
void SLTInsertPre(SLTNode** pphead, SLTNode* pos, SLTDataType x);//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);//删除指定位置的节点
void SLTErase(SLTNode** pphead, SLTNode* pos);//删除指定位置之后的节点
void SLTEraseAfter(SLTNode* pos);//链表的销毁
void SLTDestory(SLTNode** pphead);
//SList.c
#include"SList.h"
void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;while (pcur) //pcur!=NULL{printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}
//动态申请节点并存储数据
SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;return newnode;
}
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);//需要考虑空链表和非空链表两种情况if (*pphead == NULL){*pphead = newnode;}else{SLTNode* ptail = *pphead;//找尾节点while (ptail->next){ptail = ptail->next;}//此时ptail指向的就是尾节点ptail->next = newnode;}
}
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead;*pphead = newnode;
}
void SLTPopBack(SLTNode** pphead)
{//链表不能为空assert(pphead && *pphead);if ((*pphead)->next==NULL){//链表只有一个节点free(*pphead);*pphead = NULL;}else{//链表有多个节点SLTNode* prev = *pphead;SLTNode* ptail = *pphead;while (ptail->next){prev = ptail;ptail = ptail->next;}free(ptail);ptail = NULL;prev->next = NULL;}
}
void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}
//链表数据的查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{SLTNode* pcur = phead;while (pcur)//循环条件等价于pcur!=NULL{if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}
void SLTInsertPre(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pphead && *pphead);assert(pos);//若pos == *pphead时,即为头插if (pos == *pphead){SLTPushFront(pphead,x);}else{SLTNode* newnode = SLTBuyNode(x);SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}newnode->next = pos;prev->next = newnode;}
}
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);newnode->next = pos->next;pos->next = newnode;
}
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);//若pos==*pphead则是头删if (pos == *pphead){SLTPopFront(pphead);}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}
}
void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);SLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}
void SLTDestory(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}
现在我们在test.c的源文件中进行测试:
//test.c
#include"SList.h"
void SListTest01()
{//手动创建四个节点并将它们连起来SLTNode* node1 = (SLTNode*)malloc(sizeof(SLTNode));node1->data = 1;SLTNode* node2 = (SLTNode*)malloc(sizeof(SLTNode));node2->data = 2;SLTNode* node3 = (SLTNode*)malloc(sizeof(SLTNode));node3->data = 3;SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode));node4->data = 4;node1->next = node2;node2->next = node3;node3->next = node4;node4->next = NULL;SLTNode* plist = node1;SLTPrint(plist);//销毁链表SLTDestory(&plist);SLTPrint(plist);
}
int main()
{SListTest01();return 0;
}
程序运行结果:
上面是手动创建链表节点,后续我们并不需要手动地去创建节点,通过上面链表各种方法的实现之后,我们就可以直接调用这些方法来实现链表节点的增删查改:
//test.c
#include"SList.h"
void SListTest02()
{//创建一个结构体(节点结构)指针用于后续链表节点的插入SLTNode* plist = NULL;//⑴尾插节点SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);//⑵头插节点SLTPushFront(&plist, 6);SLTPrint(plist);SLTPushFront(&plist, 7);SLTPrint(plist);SLTPushFront(&plist, 8);SLTPrint(plist);//⑶查找链表中的数据SLTNode* find = SLTFind(plist, 2);if (find == NULL){printf("没有找到!\n");}else{printf("找到了!\n");}//⑷在指定位置之前插入数据SLTInsertPre(&plist, find, 11);SLTPrint(plist);//⑸在指定位置之后插入数据SLTInsertAfter(find, 22);SLTPrint(plist);//⑹尾删节点SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);//⑺头删节点SLTPopFront(&plist);SLTPrint(plist);//⑻删除指定位置的节点SLTErase(&plist, find);SLTPrint(plist);//⑼删除指定位置之后的节点SLTEraseAfter(find);SLTPrint(plist);//⑽销毁链表SLTDestory(&plist);SLTPrint(plist);
}
int main()
{SListTest02();return 0;
}
上面的各种方法需要一个一个(单独)地进行调试,以确保每个方法没有bug。
思考:当我们想保存的数据类型为字符型、浮点型或者其他自定义的类型时,该如何修改?
补充说明:
🍓1. 链式结构在逻辑上是连续的,在物理结构上不一定连续
🍓2. 节点一般是从堆上申请的
🍓3. 从堆上申请来的空间,是按照一定策略分配出来的,每次申请的空间可能连续,也可能不连续
这里所讲的单链表全称是:🍎不带头单向不循环链表🍎。关于链表的种类一共有8种,后面讲双向链表的时候会介绍。
相关文章:
数据结构-单链表
文章目录 一、单链表的概念及结构1.链表的概念2.链表的节点结构3.单链表增删查改操作的实现 一、单链表的概念及结构 1.链表的概念 🍉🍉概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中…...
软件工程期末整理(二)
快速原型开发模型是(适用于客户需求难以清楚定义、规模较小的系统)。(编写系统实施计划)不是系统设计阶段的主要活动 解释:系统实施计划”更侧重于后续的实施与部署阶段,属于项目管理层面的内容 协作性不属于构件的特性在类图中…...
【Python】基于blind-watermark库添加图片盲水印
blind-watermark 是一个用于在图像中添加和提取盲水印的 Python 库。盲水印是一种嵌入信息(如水印)到图像中的方法,使得水印在视觉上不可见,但在需要时可以通过特定的算法进行提取。以下是如何使用 blind-watermark 库来添加和提取…...
GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程
大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…...
Django:构建高效Web应用的强大框架
在当今快速发展的Web开发领域,选择一个合适的框架对于项目的成功至关重要。Django,作为Python编程语言中最受欢迎的Web框架之一,凭借其强大的功能、高度的可扩展性和简洁的语法,成为了众多开发者心中的首选。本文将深入探讨Django…...
前端-计算机网络篇
一.网络分类 1.按照网络的作用范围进行分类 (1)广域网WAN(Wide Area Network) 广域网的作用范围通常为几十到几千公里,因而有时也称为远程网(long haul network)。广域网是互联网的核心部分,其任务是长距离运送主机…...
Mybatis-plus
一、简介 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上只做增强而不做改变,目的是简化开发、提高效率。MyBatis-Plus提供了许多便捷的功能,如强大的CRUD操作、支持多种主键策略、内置代码生成器…...
跨年烟花C++代码
嘿,朋友们!今天来给大家讲讲一段挺有意思的C代码呀,这段代码主要是用来实现一个烟花效果展示的程序哦,下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…...
第82期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…...
关于FPGA中添加FIR IP核(采用了GOWIN EDA)
文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和,权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…...
基于机器学习的京东手机商品评论数据可视化分析系统
完整源码项目包获取→点击文章末尾名片!...
jenkins入门13--pipeline
Jenkins-pipeline(1)-基础 为什么要使用pipeline 代码:pipeline 以代码的形式实现,通过被捡入源代码控制, 使团队能够编译,审查和迭代其cd流程 可连续性:jenkins 重启 或者中断后都不会影响pipeline job 停顿&#x…...
Ubuntu24.04.1 LTS+Win11双系统安装记录
Win11相关 1.用DiskGenius删除硬盘分区 2.关闭win11的BitLocker,否则禁用安全启动后开机时需要帐户密钥,很麻烦。 3.在设备管理器中找到独立显卡,右键禁用。等ubuntu装好显卡驱动后,再进入win启用。 Ubuntu相关 1.Ubuntu24.04在…...
【前端开发常用网站汇总-01】
1、仿mac界面代码截图 https://codeimg.io/?utm_sourceappinn.com 2、可视化大屏汇总(在线Demo) https://www.xiongze.net/viewdata/index.html 3、在线Photoshop(实现简单P图) https://ps.gaoding.com/#/ 4、在线生成ico图标(png转icon文件) https://www.bitbug.net/in…...
【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 10.6.1. 生命周期标注语法 生命周期的标注并不会改变引用的生命周期长度。如果某个函数它制定了泛型生命周期参数,那么它就可…...
Three.js教程014:使用tween实现补间动画
补间动画tween 补间动画(Tween Animation)是一种通过平滑过渡的方式,在一段时间内将对象的属性从一个状态变换到另一个状态的动画技术。Three.js 中可以使用 tween.js 来实现补间动画。 【1】导入补间动画库 // 导入tween import * as TWEEN from "three/examples/j…...
Mac软件介绍之录屏软件Filmage Screen
软件介绍 Filmage Screen 是一款专业的视频录制和编辑软件,适用于 Mac 系统 可以选择4k 60fps,可以选择录制电脑屏幕,摄像头录制,可以选择区域录制。同时也支持,简单的视频剪辑。 可以同时录制电脑麦克风声音 标准…...
MySQL使用navicat新增触发器
找到要新增触发器的表,然后点击设计,找到触发器标签。 根据实际需要,填写相关内容,操作完毕,点击保存按钮。 在右侧的预览界面,可以看到新生成的触发器脚本...
深入理解 DOM:构建动态 Web 页面的基石
在 Web 开发的世界里,DOM (Document Object Model) 就像一位无声的英雄,默默地支撑着我们每天浏览的各种动态网页。你可能每天都在和它打交道,却未必真正了解它。那么,DOM 到底是什么?它为什么如此重要?让我…...
如何构建多层决策树
构建一颗多层的决策树时,通过递归选择最佳划分特征(依据 信息增益 或 基尼系数)对数据集进行划分,直到满足停止条件(例如叶节点纯度达到要求或树的深度限制)。以下是基于 信息增益 和 基尼系数 的递推公式和…...
人工智能 前馈神经网络练习题
为了构建一个有两个输入( X 1 X_1 X1、 X 2 X_2 X2)和一个输出的单层感知器,并进行分类,我们需要计算权值 w 1 w_1 w1和 w 2 w_2 w2的更新过程。以下是详细的步骤和计算过程: 初始化参数 初始权值:…...
stable diffusion安装mov2mov
第一步: 下载mov2mov,地址:https://gitcode.com/gh_mirrors/sd/sd-webui-mov2mov 下载包到web-ui的sd-webui-aki-v4.10\extensions文件夹面解压 第二步:在文件夹中调出cmd窗口,执行下列命令, git restore…...
人工智能学习框架概述
1. 引言 随着人工智能(AI)技术的快速发展,各种学习框架应运而生,为研究人员和开发者提供了便利。这些框架不仅简化了复杂的算法实现,还提供了用于构建、训练和评估模型的工具和环境。本文将对目前流行的人工智能学习框…...
(二)WebGL的渲染管线初识
WebGL的渲染管线可以被看作是将一组数据(例如模型、纹理、颜色等)经过一系列处理阶段,最终生成图像并显示在屏幕上的过程。为了帮助你理解这一过程,我将通过一个通俗易懂的移动例子来一步步详细讲解WebGL 的渲染管线及其关键绘制原…...
1. 使用springboot做一个音乐播放器软件项目【前期规划】
背景: 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴,资金又比较紧张,是那么的不友好。作为程序员的我,也是喜欢听着歌,敲着代码。 最近就想做一个音乐播放器的软件,在内网中使…...
在macOS上安装MySQL
macOS的MySQL有多种不同的形式: 1、本机包安装程序,它使用本机macOS安装程序(DMG)引导您完成MySQL的安装。有关详细信息,请参阅第2.4.2节,“使用本机包在macOS上安装MySQL”。您可以将包安装程序与macOS一…...
使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
在 Vue 项目中,使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比: 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本(如 Vue CLI 2.x)中提供的项目初始化模…...
ansible-性能优化
一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…...
Nginx:认证与授权
认证(Authentication)和授权(Authorization)是确保 Web 应用安全的重要机制。Nginx 提供了多种方式来实现这些功能,以保护资源免受未授权访问。 认证(Authentication):验证用户的身份,确认请求来自合法用户。通常涉及用户名和密码、令牌或其他形式的身份验证。授权(A…...
【项目实战1】五子棋游戏
目录 C语言编程实现五子棋:: game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋:: game.h #pragma once #include<stdio.h> …...
【VUE】a链接下载跨域文件直接打开而非下载(解决办法)
背景:a链接下载跨域文件时,浏览器默认会打开文件,而非直接下载 <a :href"url" :download"fileName">下载</a>data() {return {url: http://xxxxx.mp4,fileName: xxxxx.mp4} }解决方式 服务器设置HTTP请求头…...
消息队列RabbitMQ
目录 为什么需要消息队列? 什么是消息队列? 如何技术选型? WorkQueues模型 Fanout交换机 Direct交换机 Topic交换机 声明队列交换机 消息转换器 消息可靠性问题 1.发送者的可靠性 生产者重连 生产者确认 Spring AMQP生产者消费确认…...
Windows11环境下设置MySQL8字符集utf8mb4_unicode_ci
1.关闭MySQL8的服务CTRLshiftESC,找到MySQL关闭服务即可 2.找到配置文件路径(msi版本默认) C:\ProgramData\MySQL\MySQL Server 8.0 3.使用管理员权限编辑my.ini文件并保存 # Other default tuning values # MySQL Server Instance Config…...
css出现边框
前言 正常情况下,开启 contenteditable 属性后会出现 “黑色边框”。 如下图所示,很影响美观: 您可能想去掉它,就像下面这样: 解决方案 通过选择器,将 focus 聚焦时移除 outline 属性即可。 如下代码所示&a…...
Qt QDockWidget详解以及例程
Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列),也可以作为QMainWindow上的顶级窗口浮动 (类似一…...
node.js内置模块之---stream 模块
stream 模块的作用 在 Node.js 中,stream 模块是一个用于处理流(stream)的核心模块。流是一种处理数据的抽象方式,允许程序处理大量数据时不会一次性将所有数据加载到内存中,从而提高性能和内存效率。通过流࿰…...
EdgeX规则引擎eKuiper
EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…...
SpringBoot | 基于 MyBatis 的分页与模糊查询的开发模板
关注:CodingTechWork 引言 在开发 Web 应用时,常常需要处理复杂的查询需求,尤其是在涉及到用户管理功能时,分页查询和模糊查询是常见的需求之一。 本文将通过一个具体的示例,展示如何使用 MyBatis实现分页和模糊查…...
数据库(3)--针对列的CRUD操作
1.Create 新增 语法: insert into 表名 (列名)values (列)... 创建一个学生表用于演示: create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…...
利用Java爬取1688商品详情API接口:技术与应用指南
引言 1688作为中国领先的B2B电子商务平台,拥有海量的商品信息。对于商家和市场研究人员来说,能够从1688获取商品详情信息,对于市场分析、竞品研究等具有重要价值。本文将详细介绍如何使用Java编写爬虫程序,以合法、高效的方式获取…...
安装vue脚手架出现的一系列问题
安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一:可以使用管理员权限进行安装。方法二:更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发,今日着手准备开发一个新的 vue 项目时,在…...
git命令收集
强制丢弃所有修改,和仓库代码一致 git reset --hard 更新子模块 git submodule update每个子模块 重置到最新节点 git submodule foreach --recursive git reset --hard清除每个子模块未跟踪的文件 git submodule foreach --recursive git clean -fd清理未跟踪的…...
IDEA中Maven依赖包导入失败报红的潜在原因
在上网试了别人的八个问题总结之后依然没有解决: IDEA中Maven依赖包导入失败报红问题总结最有效8种解决方案_idea导入依赖还是报红-CSDN博客https://blog.csdn.net/qq_43705131/article/details/106165960 江郎才尽之后突然想到一个原因:<dep…...
c/c++ 里的进程间通信 , 管道 pipe 编程举例
(1)以下是一个网上的使用 pipe 编程的范例: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h>int main() {int pipefd…...
【Java】JVM内存相关笔记
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 程序计数器&am…...
[项目实战2]贪吃蛇游戏
目录 贪吃蛇游戏:: 一、游戏效果及功能实现: 1.规则 2.基本功能实现 3.技术要点 …...
PySide6的样式表
PySide6 提供了对 Qt 样式表(Qt Style Sheets,简称 QSS)的支持,这是一种类似于 CSS 的样式表语言,用于自定义 Qt 应用程序的外观。 1. 什么是 Qt 样式表(QSS) Qt 样式表是一种声明性的样式表语…...
计算机网络之---局域网
什么叫局域网 局域网(LAN,Local Area Network) 是指在一个相对较小的区域内,如家庭、办公室、学校、企业等,连接多个计算机和设备的网络。局域网的特点是覆盖范围小、传输速度快、构建成本较低。 局域网的主要特点&…...
使用 uniapp 开发微信小程序遇到的坑
0. 每次修改代码时,都会触发微信开发工具重新编译 终极大坑,暂未找到解决方案 1. input 无法聚焦问题 问题:在小程序开发工具中,input 会突然无法聚焦,重启也不行。但是真机调试可以正常聚焦。 解决办法:…...
基于 GEE Sentinel-1 数据集提取水体
目录 1 水体提取原理 2 完整代码 3 运行结果 1 水体提取原理 水体提取是地理信息和遥感技术的关键应用之一,对于多个领域都具有重要的应用价值。它有助于更好地管理水资源,保护环境,减少灾害风险,促进可持续发展,以…...