【数据结构】单链表的接口实现(附图解和源码)

news2024/11/15 8:36:05

单链表的接口实现(附图解和源码)


文章目录

  • 单链表的接口实现(附图解和源码)
  • 前言
  • 一、定义结构体
  • 二、接口实现(附图解+源码)
    • 1.开辟新空间
    • 2.头插数据
    • 3.头删数据
    • 4.打印整个单链表
    • 5.尾删数据
    • 6.查找单链表中的数据
    • 7.在pos位置之前插入一个节点
    • 8.在pos位置之后插入一个节点
    • 9.删除pos节点
    • 10.删除pos的下一个节点
    • 11.销毁单链表
  • 三、源代码展示
    • 1.test.c(测试+主函数)
    • 2.Slist.h(接口函数的声明)
    • 3.Slist.c(接口函数的实现)
  • 总结


前言

本文主要介绍单链表中增删查改等接口实现,结尾附总源码


一、定义结构体

在这里插入图片描述

代码如下(示例):

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLTNode;

二、接口实现(附图解+源码)

在这里插入图片描述
这里一共11个接口,我会我都会一 一为大家讲解(图解+源码


1.开辟新空间

(1)开辟一个链表类型的动态空间,将地址赋给指针newnode;
(2)将值放入newnode的data数据内;
(3)将新成员的next指针置为空指针,因为这个成员将成为链表的最后一个成员
注意:1.将malloc开辟空间存到newnode里面时,参数为结构体所占的字节大小!2.对newnode进行NULL判断!

代码如下(示例):

SLTNode* BuyListNode(SLTDataType x)//开辟新空间
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//开辟一个链表类型的动态空间 将地址赋给指着newnode
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;//将值放入newnode的data数据内
	newnode->next = NULL;//将新成员的next指针 置为空指针 因为这个成员将称为链表的最后一个成员
}

2.头插数据

注意:头插接口传参的时候一定要传二级指针变量,如果传一级指针就不会实现效果,如下图
在这里插入图片描述


代码如下(示例):

void SListPushFront(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);
	SLTNode* newnode = BuyListNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

3.头删数据

头删数据注意:当单链表为空指针NULL时,头删时会对空指针进行解引用,会造成err,所以要进行两步assert断言!在这里插入图片描述


图解实现:这里传参也需要传二级指针!
在这里插入图片描述


代码如下(示例):

void SListPopFront(SLTNode** pphead)
{
	assert(pphead);
	assert(*pphead != NULL);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

4.打印整个单链表

注意:这里传参用一级指针即可,因为不需要对结构体进行修改访问!
在这里插入图片描述


代码如下(示例):

void SListPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}

5.尾删数据

注意:分为两种情况 1.只有一个链表;2.存在两个及以上链表!

只有一个链表 :如下(示例):

if ((*pphead)->next == NULL)//如果第一个链表的next指针存放的是空指针 说明只有一个链表
	{
		free(*pphead);//将唯一一个链表的动态内存释放
		*pphead = NULL;//将指针置为空指针
	}

在这里插入图片描述


两个或两个以上链表 : 如下(示例):
第一种情况 : 定义两个指针情况

//定义2个指针方法
		SLTNode* tail = *pphead;//寻找当前需要被释放的地址 所创建的变量
		SLTNode* prev = *pphead;//删除最后一个链表数据后,所保留的最后一个链表的地址。
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		//当循环停下来时 prev指针指向的是 tail前面的一个链表  而此时tail->next 指针指向的地址是NULL
		free(tail);//释放最后一个链表对应的动态内存
		tail = NULL;//将最后一个链表指针置为空指针
		prev->next = NULL;//尾删最重要的是记得要把被删除链表的前一个链表的next指针存放地址置为空指针,避免野指针的情况。

在这里插入图片描述


两个或两个以上链表 : 如下(示例):
第二种情况 : 定义一个指针情况

//定义一个指针方法
//来到这说明至少有两个链表
	SLTNode* tail = *pphead;//将链表地址交给tail指针
	while (tail->next->next)//当tail指向的地址的地址不是空指针则继续循环
	{
		tail = tail->next;//在循环中tail拿到下一个tail的next指针地址
	}
	free(tail->next);//tail指向的next地址的动态空间被释放
	tail->next = NULL;//tail指向的next指针被置为空指针

在这里插入图片描述


6.查找单链表中的数据

单链表中查找数据和顺序表里面的查找顺序非常相似,这里不做过多介绍,如果找不到返回NULL

代码如下(示例):

SLTNode* SListFind(SLTNode* phead, SLTDataType x)
{
	SLTNode* cur = phead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		else
		{
			cur = cur->next;
		}
	}
	return NULL;
}

7.在pos位置之前插入一个节点

第一种情况(pos就是*pphead)代码如下(示例):

if (*pphead == pos)
	{
		newnode->next = *pphead;
		*pphead = newnode;
	}

在这里插入图片描述


第二种情况(pos 不是*pphead)代码如下(示例):

else
{
	//找到pos前一个链表地址
	SLTNode* posPrev = *pphead;
	while (posPrev->next != pos)
	{
		posPrev = posPrev->next;
	}
	posPrev->next = newnode;
	newnode->next = pos;
}

在这里插入图片描述


8.在pos位置之后插入一个节点

在这里插入图片描述


代码如下(示例):

void SListInserAfter(SLTNode* pos, SLTDataType x)
{
	assert(pos);
	SLTNode* newnode = BuyListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

9.删除pos节点

注意:这里分为两种情况:1.pos==*pphead;2.pos 不等于 * pphead

第一种情况 pos==*pphead,这里相等于头删

if (*pphead == pos)
	{
		//头删
		*pphead = pos->next;
		free(pos);
	}

在这里插入图片描述


第二种情况 pos 不等于 *pphead :

else
{
	//找前一个
	SLTNode* prev = *pphead;
	while (prev->next != pos)
	{
		prev = prev->next;
	}
	prev->next = pos->next;
	free(pos);
	pos = NULL;
}

在这里插入图片描述


10.删除pos的下一个节点

注意:如果链表为空,则不能删除,否则会对空指针进行访问!所以也需要进行两步assert断言
在这里插入图片描述

代码如下(示例):

void SListEraseAfter(SLTNode* pos)
{
	assert(pos);
	assert(pos->next);
	SLTNode* next = pos->next;
	pos->next = next->next;
	free(next);
	next = NULL;
}

在这里插入图片描述


11.销毁单链表

很多人都是用free直接销毁,这样会导致内存泄漏问题(因为单链表不是连续存放的),如下图所示
在这里插入图片描述


代码如下(示例):

void SListDestroy(SLTNode** pphead)
{
	assert(pphead);
	while (*pphead)
	{
		SLTNode* tmp = (*pphead)->next;
		free(*pphead);
		*pphead = tmp;
	}
	*pphead = NULL;
}

在这里插入图片描述


三、源代码展示

1.test.c(测试+主函数)

代码如下(示例):

#include "Slist.h"
void TestSList1()
{
	SLTNode* plist = NULL;
	SListPushBack(&plist, 1);//尾插
	SListPushBack(&plist, 2);//尾插
	SListPushBack(&plist, 3);//尾插
	SListPushBack(&plist, 4);//尾插
	SListPushFront(&plist, 5);//头插

	SListPopFront(&plist);//头删
	SListPopBack(&plist);//尾删
	SListPopBack(&plist);//尾删
	SListPopBack(&plist);//尾删
	SListPopBack(&plist);//尾删
	SListPopFront(&plist);//头删
	SListPrint(plist);//打印
}

void TestSList2()
{
	SLTNode* plist = NULL;
	SListPushBack(&plist, 1);//尾插
	SListPushBack(&plist, 2);//尾插
	SListPushBack(&plist, 1);//尾插
	SListPushBack(&plist, 3);//尾插
	SListPushBack(&plist, 4);//尾插
	SListPushBack(&plist, 1);//尾插
	SListPushFront(&plist, 5);//头插
	SListPopFront(&plist);//头删
	SListPrint(plist);//打印
}
void TestSList3()
{
	SLTNode* plist = NULL;
	SListPushBack(&plist, 1);//尾插
	SListPushBack(&plist, 2);//尾插
	SListPushBack(&plist, 1);//尾插
	SListPushBack(&plist, 3);//尾插
	SListPushBack(&plist, 4);//尾插
	SListPushBack(&plist, 1);//尾插
	SListPushFront(&plist, 5);//头插

	SLTNode* pos = SListFind(plist, 1);
	int i = 1;
	while (pos)
	{
		printf("第%d个pos节点:%p->%d\n", i++, pos, pos->data);
		pos = SListFind(pos->next, 1);
	}

	pos = SListFind(plist, 4);
	if (pos)
	{
		pos->data = 30;
	}
	SListPrint(plist);
}


void TestSList4()
{
	SLTNode* plist = NULL;
	SListPushBack(&plist, 2);//尾插
	SListPushBack(&plist, 3);//尾插
	SListPushBack(&plist, 4);//尾插
	SListPushBack(&plist, 5);//尾插
	SListPushBack(&plist, 6);//尾插
	SListPushFront(&plist, 1);//头插
	//SLTNode* pos = SListFind(plist, 6);
	//SListInserAfter(pos, 1);
	//SListInsert(&plist, pos, 7);
	//SListErase(&plist, pos);
	SListDestroy(&plist);
	SListPrint(plist);
}
int main()
{
	//TestSList1();
	//TestSList2();
	//TestSList3();
	TestSList4();
	return 0;
}

2.Slist.h(接口函数的声明)

代码如下(示例):

#pragma onc
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLTNode;

void SListPrint(SLTNode* phead);//打印
void SListPushBack(SLTNode** pphead, SLTDataType x);//尾插
void SListPushFront(SLTNode** pphead, SLTDataType x);//头插
void SListPopBack(SLTNode** pphead);//尾删
void SListPopFront(SLTNode** pphead);//头删
SLTNode* SListFind(SLTNode* phead, SLTDataType x);//找数据
//在pos位置前插入一个节点
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//在pos位置之后去插入一个节点
void SListInserAfter(SLTNode* pos, SLTDataType x);
void SListErase(SLTNode** pphead, SLTNode* pos);//删除pos节点
void SListEraseAfter(SLTNode* pos);//删除pos的下一个节点
void SListDestroy(SLTNode** pphead);

3.Slist.c(接口函数的实现)

代码如下(示例):

#include "Slist.h"
SLTNode* BuyListNode(SLTDataType x)//开辟新空间
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//开辟一个链表类型的动态空间 将地址赋给指着newnode
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;//将值放入newnode的data数据内
	newnode->next = NULL;//将新成员的next指针 置为空指针 因为这个成员将称为链表的最后一个成员
}
void SListPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}
void SListPushBack(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);
	SLTNode* newnode = BuyListNode(x);
	if (*pphead == NULL)
	{
		*pphead = newnode;//如果*pphead是空指针 将 newnode的地址给与 *pphead 称为链表的第一个成员
	}
	else
	{
		//如果链表已经不是空的了 *pphead那么肯定也不是NULL空指针则进入这里
		SLTNode* tail = *pphead;//用一个tail指针 接收链表地址
		while (tail->next != NULL)//while寻找链表的最后成员
		{
			tail = tail->next;//循环直至找到最后一个链表的成员
		}
		tail->next = newnode;//最后一个成员取得新链表成员地址
	}
}
void SListPushFront(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);
	SLTNode* newnode = BuyListNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}
void SListPopBack(SLTNode** pphead)
{
	assert(pphead);
	assert(*pphead != NULL);//仿C++处理错误的方式
	//来到这说明至少有一个链表  或 两个以上链表
	if ((*pphead)->next == NULL)//如果第一个链表的next指针存放的是空指针 说明只有一个链表
	{
		free(*pphead);//将唯一一个链表的动态内存释放
		*pphead = NULL;//将指针置为空指针
	}
	else
	{
		//定义2个指针方法
		SLTNode* tail = *pphead;//寻找当前需要被释放的地址 所创建的变量
		SLTNode* prev = *pphead;//删除最后一个链表数据后,所保留的最后一个链表的地址。
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		//当循环停下来时 prev指针指向的是 tail前面的一个链表  而此时tail->next 指针指向的地址是NULL
		free(tail);//释放最后一个链表对应的动态内存
		tail = NULL;//将最后一个链表指针置为空指针
		prev->next = NULL;//尾删最重要的是记得要把被删除链表的前一个链表的next指针存放地址置为空指针,避免野指针的情况。

		//定义一个指针方法
		//来到这说明至少有两个链表
		//SLTNode* tail = *pphead;//将链表地址交给tail指针
		//while (tail->next->next)//当tail指向的地址的地址不是空指针则继续循环
		//{
		//	tail = tail->next;//在循环中tail拿到下一个tail的next指针地址
		//}
		//free(tail->next);//tail指向的next地址的动态空间被释放
		//tail->next = NULL;//tail指向的next指针被置为空指针
	}
}
void SListPopFront(SLTNode** pphead)
{
	assert(pphead);
	assert(*pphead != NULL);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}
SLTNode* SListFind(SLTNode* phead, SLTDataType x)
{
	SLTNode* cur = phead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		else
		{
			cur = cur->next;
		}
	}
	return NULL;
}
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(pphead);
	SLTNode* newnode = BuyListNode(x);
	if (*pphead == pos)
	{
		newnode->next = *pphead;
		*pphead = newnode;
	}
	else
	{
		//找到pos前一个链表地址
		SLTNode* posPrev = *pphead;
		while (posPrev->next != pos)
		{
			posPrev = posPrev->next;
		}
		posPrev->next = newnode;
		newnode->next = pos;
	}
}
//自己写的
void SListInserAfter(SLTNode* pos, SLTDataType x)
{
	assert(pos);
	SLTNode* newnode = BuyListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}
void SListErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pos);
	if (*pphead == pos)
	{
		//头删
		*pphead = pos->next;
		free(pos);
	}
	else
	{
		//找前一个
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}
void SListEraseAfter(SLTNode* pos)
{
	assert(pos);
	assert(pos->next);
	SLTNode* next = pos->next;
	pos->next = next->next;
	free(next);
	next = NULL;
}
void SListDestroy(SLTNode** pphead)
{
	assert(pphead);
	while (*pphead)
	{
		SLTNode* tmp = (*pphead)->next;
		free(*pphead);
		*pphead = tmp;
	}
	*pphead = NULL;
}

总结

以上就是今天要讲的内容,本文介绍了单链表11种接口的模拟实现的图解+源代码
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/355412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 磁盘挂载

目录 Linux硬盘分区 硬盘设备的文件名 /dev/sd[a-z] 硬盘分区 识别硬盘的文件名 Linux文件系统 文件系统类型 Linux如何保存文件 VFS虚拟文件系统 磁盘挂载命令 lsblk 查看系统的磁盘使用情况 fdisk 硬盘分区 mkfs 格式化文件系统 mount 挂载命令 df 显示磁盘空间…

Java中的链表实现介绍

Java中的链表实现介绍 学习数据结构的的链表和树时&#xff0c;会遇到节点&#xff08;node&#xff09;和链表&#xff08;linked list&#xff09;这两个术语&#xff0c;节点是处理数据结构的链表和树的基础。节点是一种数据元素&#xff0c;包括两个部分&#xff1a;一个是…

pytest总结

这里写目录标题一、pytest的命名规则二、界面化配置符合命名规则的方法前面会有运行标记三、pytest的用例结构三部分组成四、pytest的用例断言断言写法&#xff1a;五、pytest测试框架结构六、pytest参数化用例1、pytest参数化实现方式2、单参数&#xff1a;每一条测试数据都会…

第五十七章 树状数组(二)

第五十七章 树状数组&#xff08;二&#xff09;一、差分的缺陷二、树状数组与差分三、例题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示样例 1 解释&#xff1a;数据规模与约定代码一、差分的缺陷 差分的作用是能够在O(1)的时间内给一段区间加上相同的数字&am…

【计算机网络】数据链路层(上)

文章目录数据链路层概述封装成帧透明传输差错检测奇偶校验循环冗余校验CRC可靠传输可靠传输基本概念实现机制 — 停止-等待协议实现机制 — 回退N帧协议实现机制 — 选择重传协议点对点协议PPP数据链路层概述 首先我蛮来看看数据链路层在网络体系结构中的地位。如图所示主机h1…

key的作用原理与列表的遍历、追加、搜索、排序

目录 一、key的作用原理 二、实现列表遍历并对在列表最前方进行追加元素 三、实现列表过滤搜索 1、用computed计算属性来实现 2、用watch监听输入值的变化来实现 四、按年龄排序输出列表 一、key的作用原理 1. 虚拟DOM中key的作用&#xff1a; key是虚拟DOM对象的标识&a…

博彩公司 BetMGM 发生数据泄露,“赌徒”面临网络风险

Bleeping Computer 网站披露&#xff0c;著名体育博彩公司 BetMGM 发生一起数据泄露事件&#xff0c;一名威胁攻击者成功窃取其大量用户个人信息。 据悉&#xff0c;BetMGM 数据泄漏事件中&#xff0c;攻击者盗取了包括用户姓名、联系信息&#xff08;如邮政地址、电子邮件地址…

Unity如何实现3D物体拆解组装

一.前言 最近有一个需求,是做一个发动机的拆卸和安装功能,其实是一个很简单的功能,但是其中有一个点我觉的非常有意思,就是拖拽组装时,物体如何精准拖到目标位置,思路有了,但是我一直找不到实现方式,早晨刷牙时无意间想到了叉乘,我才有了解决方案。就凭这一次的灵光乍…

AutoJs7、8版本快速接通vscode进行调试脚本

AutoJs7、8版本快速接通vscode进行调试脚本 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 # AutoJs7、8快速接通vscode进行调试脚本一、下载AutoJs并安装 https://download.csdn.net/download/huangbangqing12/87449177 下载完成后,…

【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波

【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波 文章目录【图神经网络】图拉普拉斯滤波器如何实现全通、低通、高通滤波1. 前言2. 符号说明3. 三种滤波3.1 全通滤波3.2 低通滤波3.2.1 平滑信号分析3.2.2 广义拉普拉斯平滑滤波器3.3 高通滤波4. 总结1. 前言 GCN&…

同步互斥与通信

我们可以把多任务系统当作一个团队&#xff0c;里面的每一个任务都相当于团队里的一个人。团队成员之间要协调工作进度&#xff08;同步&#xff09;、争用会议室&#xff08;互斥&#xff09;、沟通&#xff08;通信&#xff09;。多任务系统所涉及的概念&#xff0c;都可以在…

Spring之事务底层源码解析

Spring之事务底层源码解析 1、EnableTransactionManagement工作原理 开启 Spring 事务本质上就是增加了一个 Advisor&#xff0c;当我们使用 EnableTransactionManagement 注解来开启 Spring 事务时&#xff0c;该注解代理的功能就是向 Spring 容器中添加了两个 Bean&#xf…

【算法基础】并查集⭐⭐⭐⭐⭐【思路巧,代码短,面试常考】

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量…

二叉树的相关列题!!

对于二叉树&#xff0c;很难&#xff0c;很难&#xff01;笔者也是感觉很难&#xff01;虽然能听懂课程&#xff0c;但是&#xff0c;对于大部分的练习题并不能做出来&#xff01;所以感觉很尴尬&#xff01;&#xff01;因此&#xff0c;笔者经过先前的那篇博客&#xff0c;已…

Windows下编译安装Redis

Windows下安装Redis1.下载cygwin2.安装cygwin3.下载Redis4.编译Redis5.运行redis6.报错&#xff1a;继上次Windows下安装MySQL后&#xff0c;今天安装Redis发现也复杂许多&#xff0c;github上有几个仓库似乎提供了windows一键安装版&#xff0c;但是到 5.0版本就不更新了……所…

python机器学习

机器学习可分为两大类&#xff0c;分别为监督学习与非监督学习 监督学习 监督学习是机器学习的类型&#xff0c;其中机器使用“标记好”的训练数据进行训练&#xff0c;并基于该数据&#xff0c;机器预测输出。标记的数据意味着一些输入数据已经用正确的输出标记。 在监督学习…

设计模式之策略模式与责任链模式详解和应用

目录1.策略模式1.1 目标1.2.内容定位1.3.定义1.4.应用场景1.5.促销优惠业务场景1.6 用策略模式实现选择支付方式的业务场景1.7 策略模式在框架源码中的体现1.8 策略模式的优缺点2 责任链模式2.1 责任链楼式的应用场景2.2 利用责任链模式进行数据校验拦截2.3 责任链模式和建造者…

实战打靶集锦-006-Stapler

**写在前面&#xff1a;**记录博主的一次打靶经历。 目录1. 主机发现2. 端口发现3. 服务枚举4. 服务探查4.1 FTP探查4.1.1 匿名登录4.1.2 Elly用户4.1.3 John用户4.1.4 EXP搜索4.2 dnsmasq探查4.2.1 基础信息获取4.2.2 EXP搜索4.3 WEB应用探查4.3.1 浏览器访问4.3.2 目录扫描4.…

Nacos超简单-管理配置文件

优点理论什么的就不说了&#xff0c;按照流程开始配配置吧。登录Centos&#xff0c;启动Naocs&#xff0c;使用sh /data/soft/restart.sh将自动启动Nacos。访问&#xff1a;http://192.168.101.65:8848/nacos/账号密码&#xff1a;nacos/nacos分为两部分&#xff0c;第一部分准…

【RabbitMQ】Windows 安装 RabbitMQ

文章目录工具下载Eralng 安装与配置RabbitMQ 安装工具下载 RabbitMQ 3.7.4版本 网盘链接&#xff1a;https://pan.baidu.com/s/1pO6Q8fUbiMrtclpq2KqVVQ?pwdgf29 提取码&#xff1a;gf29 Eralng 网盘链接&#xff1a;https://pan.baidu.com/s/1irf8fgK77k8T9QzsIRwa7g?pwd9…