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

DAY15:链表实现学生信息管理系统

要求功能:

  1. 创建学生信息表 
  2. 头插法输入学生信息 
  3. 尾插法输入学生信息
  4. 输出任意位置范围内的学生信息 
  5. 头删法删除学生信息
  6. 尾删法删除学生信息
  7. 按位置添加学生信息
  8. 按位置删除学生信息 
  9. 按位置修改学生信息
  10. 按位置查找学生信息
  11. 释放空间

今天有点累,懒得写注释了,其实思路都差不多,就是找到在操作,没什么太多区别 

创建结构体

节点结构体
        len:链表长度
        data:节点数据
        next:节点后继

typedef struct Node {union {int data;int len;};struct Node* next;
} Node, *PNode;

 

创建链表

PNode linklist_creat() {PNode p = (PNode) malloc(sizeof(Node));if(NULL == p){printf("创建失败!\n");return NULL;}p->len = 0;p->next = NULL;printf("创建成功!\n");return p;
}

头插法输入学生信息

int linklist_head_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);//头插temp->next = linklist->next;linklist->next = temp;//改变长度记录linklist->len++;}printf("头插 %d 个元素成功!\n",num);return 1;
}

尾插法输入学生信息

int linklist_tail_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);PNode p = linklist;while (p->next != NULL){p = p->next;}for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);temp->next = NULL;p->next = temp;p = p->next;linklist->len++;}printf("尾插 %d 个元素成功!\n",num);return 1;
}

输出任意位置范围内的学生信息

int linklist_output(PNode linklist, int out_begin, int out_end) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(out_begin > out_end){printf("输入顺序出错!\n");return 0;}if(out_begin < 1 || out_end > linklist->len){printf("输入不在链表范围内");return 0;}PNode temp = linklist->next;int count = 1;while (count < out_begin){temp = temp->next;count++;}for (int i = out_begin; i <= out_end; ++i) {printf("%d ",temp->data);temp = temp->next;}printf("\n");printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);return 1;
}

头删法删除学生信息

int linklist_head_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {//创建删除指针PNode temp = linklist->next;//断开链接linklist->next = temp->next;//释放删除节点temp->next = NULL;free(temp);temp = NULL;linklist->len--;}printf("头删 %d 个元素完成!\n",num);return 1;
}

尾删法删除学生信息

int linklist_tail_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len || num < 1){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {PNode temp = linklist;while (temp->next->next != NULL){temp = temp->next;}free(temp->next);temp->next = NULL;linklist->len--;}printf("尾删 %d 个数据成功!\n",num);return 1;
}

按位置插入学生信息

int linklist_set_insert(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len + 1 || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 0;while (count < set){temp = temp->next;count++;}PNode new_node = (PNode) malloc(sizeof(Node));printf("请输入要插入的值:");scanf("%d",&new_node->data);new_node->next = temp->next;temp->next = new_node;linklist->len++;printf("插入新数据到 %d 位置成功\n",set);return 1;
}

按位置删除学生信息

int linklist_set_delete(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 1;while (count < set){temp = temp->next;count++;}PNode p = temp->next;temp->next = p->next;free(p);linklist->len--;printf("删除 %d 位置的数据成功\n",set);return 1;
}

按位置修改学生信息

int linklist_set_change(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("当前值为: %d\n",temp->data);printf("请输入要修改的值:");scanf("%d",&temp->data);printf("修改成功!\n");return 1;
}

按位置查找学生信息

释放空间

int linklist_free(PNode linklist) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}while (linklist->next != NULL){PNode p = linklist->next;linklist->next = p->next;p->next = NULL;free(p);p = NULL;}printf("释放成功!\n");return 1;
}

代码总和

#include <stdio.h>
#include <malloc.h>//节点结构体,len:链表长度,data:节点数据,next:节点后继
typedef struct Node {union {int data;int len;};struct Node* next;
} Node, *PNode;PNode linklist_creat();int linklist_free(PNode linklist);int linklist_head_insert(PNode linklist, int num);int linklist_tail_insert(PNode linklist, int num);int linklist_output(PNode linklist, int out_begin, int out_end);int linklist_head_delete(PNode linklist, int num);int linklist_tail_delete(PNode linklist, int num);int linklist_set_insert(PNode linklist, int set);int linklist_set_delete(PNode linklist, int set);int linklist_set_change(PNode linklist, int set);int linklist_set_find(PNode linklist, int set);int main(){PNode linklist;int chose;for (;;) {printf("请输入你的选择:");scanf("%d",&chose);if(chose == 0){printf("当前链表长度为:%-5d\n",linklist->len);} else if(chose == 1){//创建头节点linklist = linklist_creat();} else if(chose == 2){//头插int num;printf("请输入要头插节点的数量:");scanf("%d",&num);linklist_head_insert(linklist,num);} else if(chose == 3){//尾插int num;printf("请输入要尾插节点的数量:");scanf("%d",&num);linklist_tail_insert(linklist,num);} else if(chose == 4){//遍历链表int out_begin,out_end;printf("当前链表长度为:%-3d\n",linklist->len);printf("请输入要遍历的起始位置和结束位置:");scanf("%d %d",&out_begin,&out_end);linklist_output(linklist,out_begin,out_end);} else if(chose == 5){//头删int num;printf("请输入要头删的数量:");scanf("%d",&num);linklist_head_delete(linklist,num);} else if(chose == 6){//尾删int num;printf("请输入要尾删的数量:");scanf("%d",&num);linklist_tail_delete(linklist,num);}if(chose == 7){//任意位置插入int set;printf("请输入要插入的位置:");scanf("%d",&set);linklist_set_insert(linklist,set);}if(chose == 8){//任意位置删除int set;printf("请输入要删除的位置:");scanf("%d",&set);linklist_set_delete(linklist,set);}if(chose == 9){//任意位置修改int set;printf("请输入要修改的位置:");scanf("%d",&set);linklist_set_change(linklist,set);}if(chose == 10){//任意位置查找int set;printf("请输入要查找的位置:");scanf("%d",&set);linklist_set_find(linklist,set);}else if(chose == -1){//释放内存,指针指空linklist_free(linklist);free(linklist);linklist = NULL;break;}printf("\n");}return 0;
}int linklist_set_find(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("第 %d 个数据为 %d\n",set,temp->data);return 1;
}int linklist_set_change(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("当前值为: %d\n",temp->data);printf("请输入要修改的值:");scanf("%d",&temp->data);printf("修改成功!\n");return 1;
}int linklist_set_delete(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 1;while (count < set){temp = temp->next;count++;}PNode p = temp->next;temp->next = p->next;free(p);linklist->len--;printf("删除 %d 位置的数据成功\n",set);return 1;
}int linklist_set_insert(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len + 1 || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 0;while (count < set){temp = temp->next;count++;}PNode new_node = (PNode) malloc(sizeof(Node));printf("请输入要插入的值:");scanf("%d",&new_node->data);new_node->next = temp->next;temp->next = new_node;linklist->len++;printf("插入新数据到 %d 位置成功\n",set);return 1;
}int linklist_tail_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len || num < 1){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {PNode temp = linklist;while (temp->next->next != NULL){temp = temp->next;}free(temp->next);temp->next = NULL;linklist->len--;}printf("尾删 %d 个数据成功!\n",num);return 1;
}int linklist_head_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {//创建删除指针PNode temp = linklist->next;//断开链接linklist->next = temp->next;//释放删除节点temp->next = NULL;free(temp);temp = NULL;linklist->len--;}printf("头删 %d 个元素完成!\n",num);return 1;
}int linklist_output(PNode linklist, int out_begin, int out_end) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(out_begin > out_end){printf("输入顺序出错!\n");return 0;}if(out_begin < 1 || out_end > linklist->len){printf("输入不在链表范围内");return 0;}PNode temp = linklist->next;int count = 1;while (count < out_begin){temp = temp->next;count++;}for (int i = out_begin; i <= out_end; ++i) {printf("%d ",temp->data);temp = temp->next;}printf("\n");printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);return 1;
}int linklist_tail_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);PNode p = linklist;while (p->next != NULL){p = p->next;}for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);temp->next = NULL;p->next = temp;p = p->next;linklist->len++;}printf("尾插 %d 个元素成功!\n",num);return 1;
}int linklist_head_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);//头插temp->next = linklist->next;linklist->next = temp;//改变长度记录linklist->len++;}printf("头插 %d 个元素成功!\n",num);return 1;
}int linklist_free(PNode linklist) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}while (linklist->next != NULL){PNode p = linklist->next;linklist->next = p->next;p->next = NULL;free(p);p = NULL;}printf("释放成功!\n");return 1;
}PNode linklist_creat() {PNode p = (PNode) malloc(sizeof(Node));if(NULL == p){printf("创建失败!\n");return NULL;}p->len = 0;p->next = NULL;printf("创建成功!\n");return p;
}

相关文章:

DAY15:链表实现学生信息管理系统

要求功能&#xff1a; 创建学生信息表 头插法输入学生信息 尾插法输入学生信息输出任意位置范围内的学生信息 头删法删除学生信息尾删法删除学生信息按位置添加学生信息按位置删除学生信息 按位置修改学生信息按位置查找学生信息释放空间 今天有点累&#xff0c;懒得写注释了&a…...

JAVA语法基础 day05-面向对象

一、面向对象基本概念 /* 面向对象编程的步骤&#xff1a; 1.先设计对象的模板&#xff0c;也就是一个类class 生成一个新类的语句是&#xff1a;public class 类名,就跟python中class 类名一样 2.通过new关键字生成具体的对象&#xff0c;每new一次代表创建了的一个新的对象*…...

关于RabbitMQ重复消费的解决方案

一、产生原因 RabbitMQ在多种情况下可能会出现消息的重复消费。这些情况主要包括以下几个方面&#xff1a; 1. 网络问题 网络波动或中断&#xff1a;在消息处理过程中&#xff0c;由于网络波动或中断&#xff0c;消费者向RabbitMQ返回的确认消息&#xff08;ack&#xff09;…...

【SSM-Day2】第一个SpringBoot项目

运行本篇中的代码&#xff1a;idea专业版或者idea社区版本&#xff08;2021.1~2022.1.4&#xff09;->这个版本主要是匹配插件spring boot Helper的免费版(衰) 【SSM-Day2】第一个SpringBoot项目 框架->Spring家族框架快速上手Spring BootSpring Boot的作用通过idea创建S…...

【PyTorch】张量操作与线性回归

张量的操作 Tensor Operation 拼接与切分 1.1 torch.cat() torch.cat(tensors, dim0, outNone)功能&#xff1a;将张量按维度dim进行拼接 tensors&#xff1a;张量序列dim&#xff1a;要拼接的维度 1.2 torch.stacok() torch.stack(tensors, dim0, outNone)功能&#xf…...

情感类智能体——你的微信女神

智能体名称&#xff1a;你的微信女神 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/agent/preview/RulbsUjIGj4wsinydlBH7AR3NQKFungt 简介 “你的微信女神”是一个直率的智能体&#xff0c;她用犀利而真实的言辞帮助用户…...

基于SpringBoot+Vue+MySQL的养老院管理系统

系统展示 管理员界面 家属界面 系统背景 随着全球人口老龄化的加速&#xff0c;养老院管理面临着前所未有的挑战。传统管理方式存在信息不透明、效率低下、资源分配不均等问题&#xff0c;难以满足日益增长的养老服务需求。因此&#xff0c;开发一套智能化、高效的养老院管理系…...

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…...

FutureTask源码分析

Thread类的run方法返回值类型是void&#xff0c;因此我们无法直接通过Thread类获取线程执行结果。如果要获取线程执行结果就需要使用FutureTask。用法如下&#xff1a; class CallableImpl implements Callable{Overridepublic Object call() throws Exception {//do somethin…...

Highcharts甘特图基本用法(highcharts-gantt.js)

参考官方文档&#xff1a; https://www.highcharts.com/docs/gantt/getting-started-gantt https://www.highcharts.com/demo/gantt/project-management https://www.hcharts.cn/demo/gantt 链接在下面按需引入 https://code.highcharts.com/gantt/highcharts-gantt.js htt…...

【Linux庖丁解牛】—Linux基本指令(上)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a; Linux庖丁解牛 &#x1f516;克心守己&#xff0c;律己则安 目录 1、 pwd命令 2、ls 指令 3、cd 指令 4、Linux下的根目录 5、touch指令 6、 stat指令 7、mkdi…...

node.js 中的进程和线程工作原理

本文所有的代码均基于 node.js 14 LTS 版本分析 概念 进程是对正在运行中的程序的一个抽象&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;操作系统的其他所有内容都是围绕着进程展开的 线程是操作系统能够进行运算调度的最小单位&#xff0c;其是进程中的一个执…...

Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)

发布版本链接 通过百度网盘分享的文件&#xff1a;TCP调试助手V1.zip&#xff08;含客户端与服务器&#xff09; 链接&#xff1a;https://pan.baidu.com/s/14LTRPChPhYdwp_s6KeyBiA?pwdcedu 提取码&#xff1a;cedu 基于Qt/C实现了一款功能丰富的TCP服务器与客户端调试助手…...

DNS解析流程

DNS解析流程&#xff1a; 浏览器DNS缓存&#xff1a; 当我们在浏览器中访问某个域名时&#xff0c;浏览器首先会检查自己内部的DNS缓存&#xff0c;看是否有该域名的对应IP地址。如果有&#xff0c;直接使用缓存中的IP地址&#xff0c;跳过后续步骤。 本地系统DNS缓存&#xf…...

[PTA]7-1 藏头诗

[PTA]7-1 藏头诗 本题要求编写一个解密藏头诗的程序。 注&#xff1a;在 2022 年 7 月 14 日 16 点 50 分以后&#xff0c;该题数据修改为 UTF-8 编码。 输入格式&#xff1a; 输入为一首中文藏头诗&#xff0c;一共四句&#xff0c;每句一行。注意&#xff1a;一个汉字占三…...

每日OJ题_牛客_WY22 Fibonacci数列(斐波那契)

目录 牛客_WY22 Fibonacci数列&#xff08;斐波那契&#xff09; 解析代码 牛客_WY22 Fibonacci数列&#xff08;斐波那契&#xff09; Fibonacci数列_牛客题霸_牛客网 解析代码 求斐波那契数列的过程中&#xff0c;判断⼀下&#xff1a;何时 n 会在两个 fib 数之间。 #in…...

SQL 查询语句汇总

在软件开发和数据分析中&#xff0c;SQL&#xff08;结构化查询语言&#xff09;是与数据库交互的重要工具。为了更好地理解 SQL 查询语句的使用&#xff0c;本文将设计一个简单的数据库&#xff0c;包括几张表&#xff0c;并通过这些表展示各种 SQL 查询的应用。 一、背景信息…...

封装一个语言识别文字的方法

语音识别 需求&#xff1a; 参考官方文档&#xff0c;整合语音识别apicallback 的写法改为 Promise 的版本 在startRecord中&#xff1a; 参考文档实例化-开启转换将录制的内容传递给录音识别回调函数中的 Log&#xff0c;改为 Logger 在closeRecord&#xff1a; 结束识别…...

解决 iOS App Tracking Transparency 权限问题

解决 iOS App Tracking Transparency 权限问题 在 iOS 14 及更高版本中&#xff0c;Apple 引入了 App Tracking Transparency (ATT) 框架&#xff0c;要求应用在跟踪用户之前必须获得用户的明确许可。这通常涉及到访问用户的广告标识符&#xff08;IDFA&#xff09;。如果没有…...

ClickHouse 的底层架构和原理

ClickHouse 是一个用于实时分析和处理大规模数据的列式数据库&#xff0c;其设计目标是高效地处理海量数据的查询需求。它特别适合 OLAP&#xff08;Online Analytical Processing&#xff09;场景&#xff0c;能够在不依赖复杂的索引结构的情况下&#xff0c;实现极快的查询速…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...