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

带头双向循环链表的实现

目录

  • 前言
  • 节点声明
  • 链表的初始化
  • 尾插
  • 打印链表
  • 头插
  • 尾删
  • 头删
  • 查找节点
  • 指定位置插入
  • 指定位置删除
  • 链表销毁

前言

之前讲过单链表的实现,在实现的过程中,我们会发现每次删除或者在前面插入节点的时候,都要提前保存上一个节点的地址。这样做十分麻烦,所以就有了单链表的升级,双链表。今天就来实现一个带头双向循环的双链表。

带头: 指有一个哨兵位的头节点,头节点不拿来存放有效值
双向: 代表是个双向链表,一个指针存放前一个节点地址,一个地址存放后一个节点地址。
循环: 最后一个节点的下一个节点是头节点。
在这里插入图片描述

节点声明

刚刚提到过,双向链表是有2个指针的,一个指针指向前一个节点,一个指针指向后一个节点,还有一个来存放数据。

//存放的类型
typedef int ListValType;//节点结构体声明
typedef struct ListNode
{ListValType val;struct ListNode* prve;struct ListNode* next;
}LSNode;

链表的初始化

因为我们是带哨兵头的链表,所以链表需要初始化。
初始化我们只需要开辟一个头节点,但这个节点我们不存放有效值。
而因为是循环链表,所以最后一个节点要指向第一个节点,只有一个节点时,自己指向自己。
在这里插入图片描述
初始化代码

//链表初始化
LSNode* ListInto()
{//创建一个节点LSNode* newNode = (LSNode*)malloc(sizeof(LSNode));//指向自己newNode->next = newNode;newNode->prve = newNode;return newNode;
}

在这里插入图片描述
调试后发现它的next和prve指针都指向自己,说明初始化完成了。

尾插

那么我们就可以写个尾部插入来玩玩,我们都知道头节点的前一个地址是指向最后一个地址的。所以就可以直接找到尾节点进行插入。
在这里插入图片描述


//创建节点
LSNode* CreateListNode(ListValType x)
{LSNode* newNode = (LSNode*)malloc(sizeof(LSNode));if (newNode == NULL){//空间开辟失败,不玩了exit(-1);}newNode->val = x;return newNode;
}//尾插
void ListPushBack(LSNode* phead, ListValType x)
{//断言,phead不能为空assert(phead);//创建一个新节点LSNode* newNode = CreateListNodeC(x);//记录头节点的前一个节点,也就是尾节点LSNode* tail = phead->prve;//尾节点指向 新节点tail->next = newNode;//新节点前节点指向尾节点newNode->prve = tail;//后节点指向头节点newNode->next = phead;//头节点前节点指向新节点phead->prve = newNode;}

然后调试发现链表已经连起来了
在这里插入图片描述

打印链表

为了方便测试,我们对链表进行打印一下,但这次打印和之前不同,因为之前是打印到最后一个节点为NULL停止,但循环链表不存在NULL节点,所以当我们再次走到头节点的时候停止打印。

//打印链表
void ListPrint(LSNode* phead)
{assert(phead);//头节点存放的是无效值,所以从头节点下一个位置开始打印LSNode* cru = phead->next;//cru == phead时说明链表走了一圈了while (cru != phead){printf("%d->", cru->val);cru = cru->next;}printf(".....\n");
}

在这里插入图片描述
因为是循环链表,所以不可能打印完,我们打印一圈就可以了。

头插

头插也很简单,因为头节点存放的不是有效值,我们只需要记录头节点的下一个节点,然后让它的 prve节点指向新节点,让新节点next节点指向它,头节点的next指向新节点,新节点的prve节点指向头节点。
语言表达有点绕,看图。
在这里插入图片描述
代码

//头插
void ListPushFront(LSNode* phead, ListValType x)
{//断言,phead不能为空assert(phead);//创建一个新节点LSNode* newNode = CreateListNode(x);//保存头节点的下一个节点LSNode* Next = phead->next;//next前节点指向新节点Next->prve = newNode;//新节点next指向NextnewNode->next = Next;//头节点next指向新节点phead->next = newNode;//新节点前节点指向头节点newNode->prve = phead;
}

在这里插入图片描述

尾删

尾删和尾插差不多,不过需要最后一个节点的前一个节点,然后让它指向头节点,随后释放最后一个节点。
在这里插入图片描述
但是我们需要注意一个问题,当尾节点等于头节点时,那么说明链表没有节点了,哨兵头节点是不能删除的,所以这时我们需要判断或者断言一下都行。

//尾删
void ListPopBack(LSNode* phead)
{//phead不能为空assert(phead);//尾节点不能头节点一样assert(phead != phead->prve);//尾节点LSNode* tail = phead->prve;//尾节点的前一个节点LSNode* prvetail = tail->prve;//释放尾节点free(tail);//prvetail 连接 头节点prvetail->next = phead;phead->prve = prvetail;}

在这里插入图片描述

然后我们发现后面的3和2都被删掉了

头删

头删我们只需要记录头节点的下一个节点的下一个节点,因为等等头节点要和这个节点连接,然后释放掉头节点的下一个节点即可。
在这里插入图片描述

当然,头删和尾删一样,当链表只剩下头节点时,那就不能再删除了。

//头删
void ListPopFront(LSNode* phead)
{assert(phead);assert(phead != phead->prve);//头节点的下一个节点LSNode* headNext = phead->next;//下下个节点LSNode* nextnext = headNext->next;//连接头节点和 nextnextnextnext->prve = phead;phead->next = nextnext;//释放headNextfree(headNext);headNext = NULL;
}

代码执行结果
在这里插入图片描述

查找节点

这个就很简单了,思路和打印差不多,遍历一遍找,没找到返回空指针。

//查找
LSNode* ListFindNode(LSNode* phead, ListValType x)
{assert(phead);//头节点存放的是无效值,所以从头节点下一个位置开始查找LSNode* cru = phead->next;//cru == phead时说明链表走了一圈了while (cru != phead){if (cru->val == x)return cru;cru = cru->next;}return NULL;
}

在这里插入图片描述

指定位置插入

指定位置插入和头插尾插没有太大区别,如果前插,保存pos位置的前一个节点,如果后插,保存后一个节点,然后连接。
这里我们演示前插。在这里插入图片描述

//指定插入
void ListInsert(LSNode* phead, LSNode* pos, ListValType x)
{//pos和phead不能为空assert(pos && phead);//创建节点LSNode* newNode = CreateListNode(x);//保存pos的前一个节点LSNode* posprve = pos->prve;//然后连接起来posprve->next = newNode;newNode->prve = posprve;newNode->next = pos;pos->prve = newNode;}

在这里插入图片描述
我们发现这个函数也可以完成头插和尾插,所以说前面的头插和尾插可以直接复用这个函数。
头插更新

//头插
void ListPushFront(LSNode* phead, ListValType x)
{/*//断言,phead不能为空assert(phead);//创建一个新节点LSNode* newNode = CreateListNode(x);//保存头节点的下一个节点LSNode* Next = phead->next;//next前节点指向新节点Next->prve = newNode;//新节点next指向NextnewNode->next = Next;//头节点next指向新节点phead->next = newNode;//新节点前节点指向头节点newNode->prve = phead;*/ListInsert(phead,phead->next,x);
}

尾插更新

//尾插
void ListPushBack(LSNode* phead, ListValType x)
{/*//断言,phead不能为空assert(phead);//创建一个新节点LSNode* newNode = CreateListNode(x);//记录头节点的前一个节点,也就是尾节点LSNode* tail = phead->prve;//尾节点指向 新节点tail->next = newNode;//新节点前节点指向尾节点newNode->prve = tail;//后节点指向头节点newNode->next = phead;//头节点前节点指向新节点phead->prve = newNode;*/ListInsert(phead, phead->prve, x);}

指定位置删除

前删的话我们首先保存pos的前一个节点和后一个节点,然后两个节点连接,释放pos即可,也可以先释放,没有顺序要求。
在这里插入图片描述

//指定删除
void ListEase(LSNode* pos)
{assert(pos);//保存pos前后节点LSNode* posprve = pos->prve;LSNode* posnext = pos->next;//前后节点连接posprve->next = posnext;posnext->prve = posprve;//释放pos空间free(pos);pos = NULL;
}

在这里插入图片描述
我们发现它同样可以完成 头删和尾删,所以头删和尾删我们可以直接复用这个函数。
头删更新

//头删
void ListPopFront(LSNode* phead)
{/*assert(phead);assert(phead != phead->prve);//头节点的下一个节点LSNode* headNext = phead->next;//下下个节点LSNode* nextnext = headNext->next;//连接头节点和 nextnextnextnext->prve = phead;phead->next = nextnext;//释放headNextfree(headNext);headNext = NULL;*/ListEase(phead, phead->next);
}

尾删更新

void ListPopBack(LSNode* phead)
{/*//phead不能为空assert(phead);//尾节点不能头节点一样assert(phead != phead->prve);//尾节点LSNode* tail = phead->prve;//尾节点的前一个节点LSNode* prvetail = tail->prve;//释放尾节点free(tail);//prvetail 连接 头节点prvetail->next = phead;phead->prve = prvetail;*/ListEase(phead, phead->prve);
}

链表销毁

销毁是连头也一起销毁的,所以先保存后一个或前一个地址,然后释放当前地址,然后迭代一个个销毁,直到最后遇到头节点后销毁头节点并结停止迭代在这里插入图片描述

//销毁链表,因为会改变原来的phead节点,所以需要传二级指针
void ListDestroy(LSNode** pphead)
{assert(*pphead);LSNode* cru = (*pphead)->next;while (1){//保存后一个节点LSNode* next = cru->next;//释放crufree(cru);//迭代cru = next;//如果cru 和头节点相等,说明头节点后面的都删完了if (cru == *pphead){//释放头节点空间free(*pphead);//指针置空*pphead = NULL;//跳出循环break;	}}
}

在这里插入图片描述

我们在调试看看是否真的销毁成功了。
在这里插入图片描述
这样我们的带头双向循环链表已经简单实现完了。代码已上传至git,点此获取

这里还有单链表的实现,有兴趣的大佬也可以看看

相关文章:

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…...

IDEA 上传 git 项目

1. 创建项目:菜单栏 找到 VCS ,创建 git 仓库,此时代码变红了 2. 右击项目 找到 GIT --> Add,代码绿了 3. 存于本地:右击项目 找到 Git --> Commit Directory... 4. 此时存在本地git,编辑后点击 Commit出错了,不重要。commit后代码白了。5. 拉取代码,右击项目…...

基于unbantu的nginx的配置

目录 前言: 1.安装nginx并进行测试 1.1使用nginx -v 命令查看版本 1.2开启服务 查看端口 1.3测试 2.nginx的静态资源访问配置 2.1创建静态资源存放的目录 2.2写入目录中测试文件对应的内容 2.3修改配置文件 2.4 测试 3.虚拟主机配置 3.1创建目录 3.2写入测试…...

lower_bound / upper_bound 第一个 大于等于 / 大于 它的中,它属于从左往右第几个(index 0开始,如果所有都大于等于/大于,就是n)

...

DataX-Oracle新增writeMode支持update

目录 前言 第一步下载源码 第二步修改源码 1、Oraclewriter 2、WriterUtil 2.1、修改getWriteTemplate方法 2.2、新增onMergeIntoDoString与getStrings方法 3、CommonRdbmsWriter 3.1、修改startWriteWithConnection 3.2、修改doBatchInsert 3.3、修改fillPreparedStatem…...

数仓 - [04] 数仓分层

数仓分层是一种将数据仓库按照不同的层级进行组织和管理的方法。每个层级具有不同的功能和目的,旨在支持数据分析、报告和决策等不同的业务需求。一、数仓分层的意义和目的数仓分层的主要目的是实现数据的高效访问和分析,提高数据的可用性和性能,同时提供更好的灵活性和可扩…...

带头双向循环链表的实现

目录前言节点声明链表的初始化尾插打印链表头插尾删头删查找节点指定位置插入指定位置删除链表销毁前言 之前讲过单链表的实现,在实现的过程中,我们会发现每次删除或者在前面插入节点的时候,都要提前保存上一个节点的地址。这样做十分麻烦&a…...

07【C语言 趣味算法】最佳存款方案(采用 从后往前 递推解决)

目录 一、前情回顾二、Problem:最佳存款方案2.1 Description of the problem2.2 Analysis of the problem2.3 Algorithm design2.4 The complete code and the results of the run(完整的代码 以及 运行结果)一、前情回顾 06【C语言 & 趣味算法】牛顿迭代法求方程根(可…...

游戏开发36课 cocoscreator scrollview优化

在cocoscreator内,ScrollView控件封装的挺完美的了,不过对于一些对性能要求比较高的场景,会存在问题,以top100排行榜排行榜举例子 1、应用卡顿甚至崩溃 按照官方用例使用ScrollView,插入100个玩家的item,理…...

屏幕开发学习 -- 迪文串口屏

一 前言 最近学习了一款基于图形化开发的屏幕,在摸索一周后,基本熟悉了这款产品的一个开发过程,今天给大家分享一下迪文串口屏的学习过程,有不足之处,还请见谅😁,包含了环境搭建和功能DEMO 二 …...

微机-------CPU与外设之间的数据传送方式

目录 一、无条件方式二、查询方式三、中断方式四、DMA方式一、无条件方式 外设要求:简单、数据变化缓慢。 外设被认为始终处于就绪状态。始终准备好数据或者始终准备好接收数据。 IN AL,数据端口 数据端口的地址通过CPU的地址总线送到地址译码器进行译码,同时该指令进行的是…...

从源码上解决rosdep update失败问题

(一)卸载官方的rosdep、rosdistro 卸载rosdistro # python2 sudo apt-get purge python-rosdistro# python3 sudo apt-get purge python3-rosdistro卸载rosdep # python2 sudo apt-get purge python-rosdep# python3 sudo apt-get purge python3-rosd…...

常用的shell命令

常用的shell命令 1、ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行 ls -lh 显示文件的…...

新手入门SLAM必备资料

新手入门SLAM必备资料 文章目录 新手入门SLAM必备资料一、SLAM学习书籍1.必读经典2.有很多期,跟着会议一起出的文集3.入门书籍,简单实现及代码4.SLAM入门教材吐血推荐,对深入理解SLAM实质非常有帮助5.作者Joan Sola关于Graph-SLAM的教程,包含位姿变换、传感器模型、图优化以…...

如何选择和使用腾讯云服务器的方法新手教程

本文将介绍如何选择和使用腾讯云服务器的方法新手教程。云服务器能帮助快速构建更稳定、安全的应用,降低开发运维的难度和整体IT成本。腾讯云CVM云服务器提供多种类型的实例、操作系统和软件包。各实例中的 CPU、内存、硬盘和带宽可以灵活调整,以满足应用…...

亚马逊云科技re:Invent:Serverless是所有构想的核心

12月2日,2022亚马逊云科技re:Invent全球大会上,Amazon.com副总裁兼首席技术官Werner Vogels博士向开发者们展示了另一种可能。在一系列Serverless工具的帮助下,一些代码可以少写,因为未来你可能再也不需要写它们了。这恐怕是自云原…...

数据链路层(必备知识)

文章目录1、数据链路层的作用2、认识以太网<1>以太网帧格式<2>认识MAC地址<3>认识MTU<4>查看硬件地址和MTU3、ARP协议<1>什么是ARP协议<2>ARP数据报格式<3>ARP协议的工作机制4、其他重要协议或技术<1> DNS<2>NAT技术1、…...

【Spring系列】- Spring循环依赖

Spring循环依赖 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 一个有梦有戏的人 怒放吧德德 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大…...

Python学习基础笔记二十一——迭代器

列表&#xff0c;我们使用for循环来取值&#xff0c;我们把每个值都取到&#xff0c;不需要关心每一个值的位置&#xff0c;因为只能顺序的取值&#xff0c;并不能跳过任何一个去取其他位置的值。那么我们为什么可以使用for循环来取值&#xff0c;for循环内部是怎么工作的呢&am…...

【云原生之Docker实战】使用docker部署IT资产管理系统GLPI

【云原生之Docker实战】使用docker部署IT资产管理系统GLPI 一、GLPI介绍1.GLPI简介2.GLPI功能二、检查本地docker环境1.检查docker版本2.检查docker状态三、下载GLPI镜像四、编辑docker-compose.yaml文件五、部署GLPI系统1.创建数据目录2.使用docker compose创建容器应用3.查看…...

【SSM框架 二】Spring

文章目录二、Spring1、简介2、IOC理论思想3、Hello Spring4、IOC创建对象的方式4.1 无参构造构造器注入4.2 有参构造器注入5、Spring的配置5.1 别名5.2 Bean的配置5.3 import6、DI依赖注入6.1 构造方法注入6.2 set方法注入6.3 扩展注入6.4、Bean的作用域7、Bean的自动装配7.1 正…...

基于java+ssm+vue+mysql的社区流浪猫狗救助网站

项目介绍 随着迅速的发展&#xff0c;宠物饲养也较以前发生很大的变化&#xff0c;社区流浪猫狗救助网站系统以其独有的优势脱颖而出。“社区流浪猫狗救助网站”是以JAVA程序设计语言课为基础的设计出适合社区流浪猫狗救助网站&#xff0c;其开发过程主要包括后台数据库的建立…...

推特营销引流入门指南

一、关注 当您关注另一个Twitter用户时&#xff0c;您进行订阅&#xff0c;即可立即阅读其内容分享。因此&#xff0c;请评估您关注的人&#xff0c;尤其是刚开始时。跟踪新用户的一种简单方法是找到他们的个人资料&#xff0c;然后单击“关注”按钮。 Twitter对于那些疯狂点…...

Seata概述基础

分布式事务原因&#xff1a; 单体架构的spring事务不能跨机器&#xff0c;不能跨数据源 分布式事务的概念&#xff1a; 一个业务流程&#xff0c;在分布式系统&#xff08;微服务&#xff09;中&#xff0c;每个业务模块都是一个分支&#xff0c;保证每个业务分支一起成功&am…...

Python学习基础笔记二十二——生成器

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值&#xff0c;但是yield又不同于return&#xff0c;return的执行意味着程序的结束&#xff0c;调用生成器函数不会得到返回的具体的值&#xff0c;而是得到一个可迭代的对象。每一次获取这个可迭代对…...

python -- PyQt5(designer)中文详细教程(四)事件和信号

事件 signals and slots也 被其他⼈翻译成信号和槽机制。 所有的应用都是事件驱动的。事件大部分都是由用户的行为产⽣的&#xff0c;当然也有其他的事件产生方式&#xff0c;比如网络的连接&#xff0c;窗口管理器或者定时器等。调⽤应⽤的exec_()⽅法时&#xff0c;应⽤会进⼊…...

你绝对想象不到的端对端通信的几种方式

一、前言 今天要和大家说的是我们常用的一些端对端的通信方式&#xff0c;这里我们会以python和php语言为主&#xff0c;举例说明客户端、浏览器端和服务器端通信&#xff0c;部分代码可能展示不全&#xff0c;不过我会放在文末链接供大家下载测试&#xff0c;下面我们先来让大…...

序列化--Serial

序列化&#xff1a;将数据结构或对象转换成二进制串的过程。 反序列化&#xff1a;将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。 Parcelable 与 Serializeable 的区别 SerializableParcelable通过IO对硬盘操作&#xff0c;速度较慢直接在内存操作&#x…...

BDD - SpecFlow ExternalData Plugin 导入外部测试数据

BDD - SpecFlow ExternalData Plugin 导入外部测试数据引言SpecFlow ExternalData 插件支持的数据源Tags实践创建一个 Class Libary Project添加 NuGet Packages添加测试数据源文件CSV 文件Excel 文件添加 Feature 文件实现 Step Definition执行Scenario 导入测试数据源Scenari…...

[Power Query] 日期和时间处理

Power Query查询编辑器为日期和时间数据提供了强大而快捷的处理方式 例1: 从日期中提取年、月份、日、季度、周、天等信息 数据源 步骤1:将数据源导入到Power BI Desktop&#xff0c;单击【转换数据】选项&#xff0c;进入Power Query查询编辑器界面 步骤2:选中"日期&qu…...

设计模式之抽象工厂模式

利用反射技术简单梳理抽象工厂模式 工厂模式实现 通常我们在实际工作中&#xff0c;经常遇到需要访问数据库的场景。 而常见的数据库又多种多样&#xff0c;怎么样针对不同的数据库来建立不同的数据库连接呢&#xff1f; 我们可以看下用抽象工厂模式加上反射技术来如何实现。…...

JavaWeb_第5章_会话技术_Cookie+Session

JavaWeb_第5章_会话技术_CookieSession 文章目录JavaWeb_第5章_会话技术_CookieSession1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1…...

跟着实例学Go语言(一)

本教程全面涵盖了Go语言基础的各个方面。一共80个例子&#xff0c;每个例子对应一个语言特性点&#xff0c;非常适合新人快速上手。 教程代码示例来自go by example&#xff0c;文字部分来自本人自己的理解。 本文是教程系列的第一部分&#xff0c;共计20个例子、约1万字。 目…...

数据库基础 - 数据类型、关键字、cmd中操作数据库的命令

cmd中操作数据库的命令 mysql -hlocalhost -用户名 -密码 show database&#xff1b;查询数据库中的小数据库 show 数据库名&#xff1b;查询某一个小数据库 show 表名&#xff1b;查询表的结构 exit 退出数据类型 数值类型 int &#xff1a;整形 double&#xff1a;双精度&…...

2022SDNU-ACM结训赛题解

首先感谢一下各位出题人的精心准备、验题人的辛勤付出、以及选手的积极参加 题解 Problem A 柳予欣的归来【数学】 出题人&#xff1a; bhq 没想到一血是被打完山大的牛客比赛后来结训赛玩的wyx拿走的&#xff01; 题目描述&#xff1a; 计算(∑0<d<pd−1)m(\sum_{0…...

《人类简史》笔记三—— 历史从无正义

目录 一、尽管把人人生而平等喊得震天响&#xff0c;其实还是把人分成了上下等级 二、恶性循环 三、当男人究竟有什么好的&#xff1f; 一、尽管把人人生而平等喊得震天响&#xff0c;其实还是把人分成了上下等级 古时候&#xff1a; 上等人 平民和奴隶 现在&#xff1a;…...

Python实现基于用户的协同过滤推荐算法构建电影推荐系统

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 基于用户的协同过滤推荐&#xff08;User-based CF&#xff09;的原理假设&#xff1a;跟你喜好相似的人…...

阿里巴巴专场——第322场周赛题解

目录 模拟法&#xff1a;6253.回环句 排序后模拟&#xff1a;6254. 划分技能点相等的团队 BFS&#xff1a;6255. 两个城市间路径的最小分数 BFS&#xff1a;6256. 将节点分成尽可能多的组 模拟法&#xff1a;6253.回环句 这道题直接按照题目的意思暴力模拟即可&#xff1a;…...

【机器学习】支持向量回归

有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 在阅读本篇之前建议先学习&#xff1a; 【机器学习】支持向量机【上】硬间隔 【机器学习】支持向量机【下】软间隔与核函数 支持向量回归 支持向量回归&#xff08;support vector regression&#xf…...

Linux安装mysql

1、 查看是否已经安装 Mysql rpm -qa | grep mysql 如果你查看出来有东西&#xff0c;可以使用下面命令将其删除 rpm -e 文件名 2 、下载官方 Mysql 包 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 如果安装有提示&#xff1a;Cannot…...

JeecgBoot搭建(低代码)

环境安装 后端&#xff1a;JDK: 1.8 (小于11)、Maven: 3.5、MySql: 5.7、Redis: 3.2 前端&#xff1a;Node Js: 14.18 / 16、Npm: 5.6.0、Yarn: 1.21.1 、Pnpm 工具&#xff1a; IDEA、Navicat、Git、TortoiseGit拉取代码 后端&#xff1a;git clone https://gitee.com/jeecg/…...

【java】3-获取线程引用与线程的属性

1.获取线程的引用 在创建一个线程之后&#xff0c;我们很有必要去获取当前线程实例的引用&#xff0c;以便能够观察到线程的一些属性&#xff0c;或是对于当前线程进行一系列的操作 调用Thread类的静态方法currentThread&#xff0c;我们便能拿到当前线程的引用 Thread.curr…...

2022-12-04一周学习

这周基本上还是在对前端学习的更多一点&#xff0c;主要是之前没有重视vue3的学习,现在在补上来&#xff0c;学习了vue3的一些知识&#xff0c;前端的权限管理&#xff0c;设置路由守卫&#xff0c;pinia&#xff0c;还学习了redis的一些基本操作&#xff0c;之前只是照搬了别人…...

CG-34 浊度传感器 简单说明

产品概述 浊度传感器是一种智能监测水中悬浮物对光线透过时所发生的阻碍程度的仪器。允许在水中的测量点进行无人值守的操作。采用自清洗设计&#xff0c;可清除水中附着物以及气泡聚集而影响测量结果。具有优异的抗污染能力&#xff0c;即使恶劣的环境长期在线监测&#xff0c…...

跟着实例学Go语言(二)

本教程全面涵盖了Go语言基础的各个方面。一共80个例子&#xff0c;每个例子对应一个语言特性点&#xff0c;非常适合新人快速上手。 教程代码示例来自go by example&#xff0c;文字部分来自本人自己的理解。 本文是教程系列的第二部分&#xff0c;共计20个例子、约1.2万字。 …...

linux+window+macos下的JDK安装

1. Linux中安装JDK &#xff08;1&#xff09;下载Linux版本的jdk压缩包 &#xff08;2&#xff09;解压 tar -zxvf 压缩包名 例如&#xff1a; tar -zxvf jdk-8u251-linux-x64.tar.gz&#xff08;3&#xff09;在系统配置文件配置java 编辑profile配置文件 vim /etc/prof…...

DiffuSEEG:一种基于stable diffusion 的SEEG数据补全方法

目录一. 立体脑电图&#xff08;SEEG&#xff09;1.1 SEEG概念1.2 SEEG作用1.3 SEEG的适用场景1.4 操作方法一. 立体脑电图&#xff08;SEEG&#xff09; 1.1 SEEG概念 立体脑电图&#xff08;SEEG&#xff09;&#xff1a;是一种借助外科微创的方法将电极植入到大脑不同的部…...

kubernetes—Service介绍

Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资…...

AlphaFold2源码解析(7)--模型之Evoformer

AlphaFold2源码解析(7)–模型之Evoformer 这篇文章我们主要药讲解AlphaFold2的Evoformer的代码细节。 Evoformer Stack 该网络有一个双塔结构&#xff0c;在MSA堆栈中具有轴向的自我注意&#xff1b;在Pair堆栈中具有三角形的乘法更新和三角形的自我注意&#xff1b;以及外积…...

docker 安装 redis 6.0.8 cluster 实战 (3主3从) 动态扩容

这里将上篇博客搭建的3主3从 扩容为 4主4从 1. 新建两个node节点 docker run -d \ --net host \ --privileged \ --name redis-node-7 \ --log-opt max-size100m \ --log-opt max-file3 \ -v /root/docker/redis-node-7/data:/data \ redis:6.0.8 \ --cluster-enabled yes \ -…...

20221204

You are so much more than how you look. 你比你的外表更有魅力 Never give up until the fight is over. 永远不要放弃&#xff0c;要一直战斗到最后一秒。 whats done cannot be undone 覆水难收 If I was going somewhere, I was running。 如果我要去哪儿&#xff…...

CN_数据链路层流量控制@可靠的传输机制@ARP协议

文章目录流量控制技术(协议)停止-等待流量控制滑动窗口流量控制发送窗口接收窗口基本原理可靠的传输机制确认机制ACK超时重传机制RTOARQ处理差错自动重传请求ARQ协议&#x1f388;ARQ具体协议单帧ARQ协议停止-等待协议SW-ARQ例连续ARQ协议后退N帧协议(GBN)GBN多帧滑动窗口累计确…...

程序人生 | 与足球共舞的火柴人(致敬格拉利什,赋予足球更深的意义)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…...

安装ubuntu20.04, CUDA11.4, cnDNN, tensorflow, pytorch

ubuntu22.04默认python为3.11 ubuntu20.04默认python为3.8 第一步&#xff0c;分区安装系统 efi引导区, 逻辑分区&#xff0c;512M root: 主分区&#xff0c;512M swap: 逻辑分区&#xff0c;64G home:逻辑分区&#xff0c;320G /:逻辑分区, 130G&#xff0c; CUDA是安装…...

shell脚本受限执行

shell 中运行的脚本或脚本的个代码断会禁用一些正常 shell 中可以执行的命令.这是限制脚本用户的权限和最小化运行脚本导致的破坏的安全措施.受限的内容包括&#xff1a;使用 cd 命令更改工作目录. 更改环境变量$PATH, $SHELL, $BASH_ENV,或$ENV 的值. 读或更改 shell 环境选项…...

HTTP 速查手册

一、通用身份验证 # 服务端返回401&#xff0c;并告知验证类型为Basic GET 401 Unauthorized WWW-Authenticate: Basic realm"description"# 浏览器输入验证信息后&#xff0c;请求头中携带验证信息 Authorization: Basic xxxxxxxxxx二、Cookie # 服务端返回set-co…...

低成本高效率的推广利器,自养号测评:跨境卖家的稳定增长之道

测评是电商平台上最有效的推广方式之一。在进行测评之前&#xff0c;关键是选择潜力爆款产品。对于卖家和工作室来说&#xff0c;不可能每个产品都是爆款&#xff0c;因此需要精选有潜力的产品进行测评。 通过关键词流量和转化率规划每天的测评账单&#xff0c;以确保多个入口下…...

leeetcode热题100.每日温度

作者&#xff1a;晓宜 &#x1f308;&#x1f308;&#x1f308; 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 &#x1f319;&#x1f319;&#x1f319; 分享单调栈的用法&#xff0c;有顺序和…...

C语言之---柔性数组

1.1前记 也许你从来没有听说过柔性数组这个概念&#xff0c;但是它是确实存在的。 C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就是柔性数组成员。 例如: struct st_type {int i;int a[0]; }; 有些编译器会报错无法编译可以改为&#xff1a…...

admin端

一、创建项目 参考文章 Vue3.3 Vite Element-Plus TypeScript 从0到1搭建企业级后台管理系统&#xff08;前后端开源&#xff09; - 掘金 1.1 技术栈 1.2 vite 项目初始化 npm init vitelatest vue3-element-admin --template vue-ts 1.3 src 路径别名配置 Vite 配置 配置…...

collections库

collections 模块是 Python 标准库中的一个模块&#xff0c;提供了额外的数据容器和工具&#xff0c;用于增强 Python 内置的数据容器的功能。下面是 collections 模块中一些常用的数据容器和工具&#xff1a; namedtuple&#xff1a;命名元组是一个用于创建具有命名字段的元组…...

云服务器运营商后台管理安全规则与操作系统中的防火墙规则的区别

问&#xff1a;操作系统中的防火墙规则和云服务器运营商后台管理网页层面上的防火墙规则有何不同&#xff0c;为什么我在操作系统的防火墙开放某个端口之后&#xff0c;运营商后台管理网页层面没有开放&#xff0c;依然不能远程访问&#xff1f;而当运营商后台管理网页层面对其…...