数据结构——单链表

在这里插入图片描述

无头单向非循环链表的建立

  • 前言——什么链表
    • 链表形象图
    • 链表分类
  • 一、Single_linked_list.h头文件的建立
  • 二、Single_linked_list.c功能函数的定义
  • Single_linked_list_test.c主函数的定义
  • 四、代码运行测试
  • 五、Single_linked_list完整代码演示:
  • 总结


前言——什么链表

链表的概念及结构概念:
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

链表形象图

链表具体表现是怎么样的呢?让我们通过下面的图片来了解一下!

在这里插入图片描述

形象一点形容呢,那就像一个车厢相互链接的火车,这样好记住多了吧!
在这里插入图片描述

注意:
. 从上图可看出,链式结构在逻辑上是连续的,但在物理上不一定连续
. 现实中的结点一般是都是从堆上申请来的
. 从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续

链表分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

  1. 单向或者双向
    在这里插入图片描述

  2. 带头或者不带头
    在这里插入图片描述

  3. 循环或者非循环
    在这里插入图片描述

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:
无头单向非循环链表
在这里插入图片描述

带头双向循环链表
在这里插入图片描述


今天我们要实现的是无头单向非循环链表,让我们跟随下面的步骤来建立单链表吧

一、Single_linked_list.h头文件的建立

1.头文件的声明

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

2.单链表的接口实现

typedef int SLTDataType;//类型重命名
//单链表接口定义
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;

3.打印函数以及创建结点函数的声明

//打印
void SLTPrint(SLTNode* phead);
//创建结点
SLTNode* BuySListNode(SLTDataType x);

4.尾插、头插函数的声明

//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);

在这里插入图片描述

在这里插入图片描述

5.尾删头删函数的声明

//尾删
void SLTPopBack(SLTNode** pphead);
//头删
void SLTPopFront(SLTNode** pphead);

在这里插入图片描述
在这里插入图片描述

6.查找函数的声明

SLTNode* SLTFind(SLTNode* phead, SLTDataType x);

7.定点pos前后插入函数的声明

// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x);

在这里插入图片描述
在这里插入图片描述

8.定点删除pos或删除pos后一位结点的函数的声明

// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);
// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos);

在这里插入图片描述
在这里插入图片描述

二、Single_linked_list.c功能函数的定义

1.头文件的声明

#include "Single_linked_list.h"

2.打印函数以及创建结点函数的定义

//打印
void SLTPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur)//cur!=NULL为真{printf("%d ", cur->data);cur = cur->next;}printf("NULL\n");//打印尾结点的next结点NULL
}//创建结点
SLTNode* BuySListNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//创建一个新结点if (newnode == NULL)//创建失败返回错误结束程序{perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;//将新结点的next结点置为NULLreturn newnode;
}

3.尾插、头插函数的定义

//尾插
//传入结构体指针,用二级指针接收
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);//调用函数创建新结点//两种情况 头结点为空时和头结点不为空时if (*pphead == NULL){// 改变的结构体的指针,所以要用二级指针*pphead = newnode;}else{SLTNode* tail = *pphead;while (tail->next != NULL)//遍历链表到尾结点{tail = tail->next;}// 改变的结构体,用结构体的指针即可tail->next = newnode;}
}//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);newnode->next = *pphead;// 改变的结构体的指针,所以要用二级指针*pphead = newnode;
}

4.尾删头删函数的定义

//尾删
void SLTPopBack(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空//一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else//一个以上节点{SLTNode* tail = *pphead;while (tail->next->next)//遍历链表到尾结点{tail = tail->next;}free(tail->next);tail->next = NULL;}
}//头删
void SLTPopFront(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;
}

当然,尾删不只一种方法,另一种方法就是:

void SLTPopBack(SLTNode** pphead)
{assert(*pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* tailPrev = NULL;//设置一个前驱结点,方便置空SLTNode* tail = *pphead;while (tail->next){tailPrev = tail;tail = tail->next;}free(tail);tailPrev->next = NULL;}
}

5.查找函数的定义

SLTNode* SLTFind(SLTNode* phead, SLTDataType x) {SLTNode* cur = phead;while (cur != NULL&&cur->data != x ) {cur = cur->next;}if (cur == NULL) {printf("未查找到有效结点\n");exit(-1);}return cur;
}

6.定点pos前后插入函数的定义

// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(curPrev,pos->data);if (curPrev == cur) {newnode->next = *pphead;*pphead = newnode;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}newnode->next = cur;curPrev->next = newnode;}
}// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);newnode->next = cur->next;cur->next = newnode;
}

7.定点删除pos或删除pos后一位结点的函数的定义

// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (curPrev == cur) {temp = cur->next;free(cur);cur = temp;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}curPrev->next = cur->next;free(cur);cur = NULL;}
}// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (cur->next == NULL) {return;}else {temp = cur->next;cur->next = temp->next;free(temp);temp = NULL;}
}

Single_linked_list_test.c主函数的定义

1.头文件的声明

#include "Single_linked_list.h"

2.测试调用函数的定义

void TestSList() {SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPushFront(&plist, 10);SLTPushFront(&plist, 20);SLTPushFront(&plist, 30);SLTPushFront(&plist, 40);SLTPrint(plist);SLTNode* pos = BuySListNode(3);SLTInsert(&plist,pos, 6);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTInsertAfter(&plist, pos, 7);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(6);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(7);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(1);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);
}

3.主函数的定义

int main()
{TestSList();return 0;
}

四、代码运行测试

示例一:

void TestSList2()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPushFront(&plist, 10);SLTPushFront(&plist, 20);SLTPushFront(&plist, 30);SLTPushFront(&plist, 40);SLTPrint(plist);
}

运行结果:
在这里插入图片描述
示例二:

void TestSList3()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);}

运行结果:
在这里插入图片描述
示例三:

void TestSList5() {SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = BuySListNode(3);SLTInsert(&plist,pos, 6);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTInsertAfter(&plist, pos, 7);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(6);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(7);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(1);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);
}

运行结果:
在这里插入图片描述

五、Single_linked_list完整代码演示:

Single_linked_list.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);
//创建结点
SLTNode* BuySListNode(SLTDataType x);//尾插
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);// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x);// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos);

Single_linked_list.c

#include "Single_linked_list.h"//打印
void SLTPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur)//cur!=NULL为真{printf("%d ", cur->data);cur = cur->next;}printf("NULL\n");//打印尾结点的next结点NULL
}//创建结点
SLTNode* BuySListNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//创建一个新结点if (newnode == NULL)//创建失败返回错误结束程序{perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;//将新结点的next结点置为NULLreturn newnode;
}//尾插
//传入结构体指针,用二级指针接收
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);//调用函数创建新结点//两种情况 头结点为空时和头结点不为空时if (*pphead == NULL){// 改变的结构体的指针,所以要用二级指针*pphead = newnode;}else{SLTNode* tail = *pphead;while (tail->next != NULL)//遍历链表到尾结点{tail = tail->next;}// 改变的结构体,用结构体的指针即可tail->next = newnode;}
}//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);newnode->next = *pphead;// 改变的结构体的指针,所以要用二级指针*pphead = newnode;
}//尾删
void SLTPopBack(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空//一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else//一个以上节点{SLTNode* tail = *pphead;while (tail->next->next)//遍历链表到尾结点{tail = tail->next;}free(tail->next);tail->next = NULL;}
}//头删
void SLTPopFront(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;
}//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x) {SLTNode* cur = phead;while (cur != NULL&&cur->data != x ) {cur = cur->next;}if (cur == NULL) {printf("未查找到有效结点\n");exit(-1);}return cur;
}// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(curPrev,pos->data);if (curPrev == cur) {newnode->next = *pphead;*pphead = newnode;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}newnode->next = cur;curPrev->next = newnode;}
}// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);newnode->next = cur->next;cur->next = newnode;
}// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (curPrev == cur) {temp = cur->next;free(cur);cur = temp;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}curPrev->next = cur->next;free(cur);cur = NULL;}
}// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (cur->next == NULL) {return;}else {temp = cur->next;cur->next = temp->next;free(temp);temp = NULL;}
}

Single_linked_list_test.c

void TestSList() {SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = BuySListNode(3);SLTInsert(&plist,pos, 6);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTInsertAfter(&plist, pos, 7);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(6);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(7);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(1);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);
}int main()
{TestSList();return 0;
}

总结

无头单项非循环链表是链表的初始内容!
有点难度,但是不多,记住指针与多级指针之间的关系!
我相信大家也一定可以写出比我更好的代码!

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

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

相关文章

一条自由游动的鲸鱼

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>鲸鱼</title><style>#canvas-container {width: 100%;height: 100vh;overflow: hidden;}&l…

HTML之表单标签

目录 表单标签 Form表单 定义&#xff1a; 基本语法结构&#xff1a; form属性&#xff1a; enctyoe属性 fieldeset标签 fieldeset属性 legend标签 label标签 优势 label属性 input标签 input属性 input标签中的type属性 text text输入框有以下配套属性 searc bu…

太魔幻了!计算机就业哀鸿遍野,而高考生疯狂涌向计算机专业

在张雪峰推荐的几大专业里&#xff0c;计算机专业是其中之一。近几年&#xff0c;计算机专业报考热度不减&#xff0c;但就业前景却令人堪忧&#xff0c;互联网裁员接二连三&#xff0c;许多码农找不到工作。 一位网友感叹&#xff1a;一边是计算机就业哀鸿遍野&#xff0c;一…

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(gitee\github)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

Mac电脑目录

System&#xff08;系统&#xff09;Applications&#xff08;应用程序&#xff09;应用程序目录&#xff0c;默认所有的GUI应用程序都安装在这里User&#xff08;用户&#xff09;存放用户的个人资料和配置。每个用户有自己的单独目录Library&#xff08;资料库&#xff09;系…

Android的Handler消息通信详解

目录 背景 1. Handler基本使用 2. Handler的Looper源码分析 3. Handler的Message以及消息池、MessageQueue 4. Handler的Native实现 4.1 MessageQueue 4.2 Native结构体和类 4.2.1 Message结构体 4.2.2 消息处理类 4.2.3 回调类 4.2.5 ALooper类 5. 总结&…

基于fpga_EP4CE6F17C8_秒表计数器

文章目录 前言实验手册一、实验目的二、实验原理1&#xff0e;理论原理2&#xff0e;硬件原理 三、系统架构设计四、模块说明1&#xff0e;模块端口信号列表dig_driver(数码管驱动模块)key(按键消抖模块)top(顶层模块) 2&#xff0e;状态转移图3&#xff0e;时序图五、仿真波形…

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…

国际阿里云实名账号CDN加速和OSS传输加速有什么区别?

详细信息 阿里云对象存储OSS以海量、安全、低成本、高可靠等特点已经成为用户存储静态资源和文件的首要选择&#xff0c;实际使用中面向全球各地用户访问OSS资源时&#xff0c;访问速度会受到客户端网络、OSS的下行带宽、Bucket地域、访问链路长等限制出现访问慢的情况。以下主…

2023 电赛 E 题 K210 方案

第一章&#xff1a;K210 介绍 K210芯片是一款基于RISC-V架构的嵌入式人工智能芯片&#xff0c;具备低功耗、高性能的特点。它拥有强大的图像处理和机器学习能力&#xff0c;适用于边缘计算设备和物联网应用。为了方便开发者&#xff0c;K210芯片提供了丰富的外设接口&#xff…

linux or mac 查看进程的pid和占有的端口

1.查看谁占有了什么端口&#xff1f; lsof -i:<占用端口> [rootgit-lab gitlab]# lsof -i:8929 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME docker-pr 25090 root 4u IPv4 140059875 0t0 TCP *:8929 (LISTEN) docker-pr 25096 root …

nginx和openssl版本升级操作手册

我们目前使用的是nginx1.20.2和openssl-1.0.2k。其中查看服务器上openssl的脚本名利是&#xff1a;openssl version -v/-a 一&#xff1a;需要的包 1:nginx-1.25.1.tar.gz 2:openssl-1.1.1u.tar.gz 二&#xff1a;升级操作 1&#xff1a;检查当前nginx版本 /usr/local/nginx…

7.物联网操作系统互斥信号量

1.使用互斥信号量解决信号量导致的优先级反转&#xff0c; 2.使用递归互斥信号量解决互斥信号量导致的死锁。 3.高优先级主函数中多次使用同一信号量的使用&#xff0c;使用递归互斥信号量&#xff0c;但要注意每个信号量的使用要对应一个释放 优先级翻转问题 优先级翻转功能需…

gateway过滤器没生效,特殊原因

看这边文章的前提&#xff0c;你要会gateway&#xff0c;知道过滤器怎么配置&#xff1f; 直接来看过滤器&#xff0c;局部过滤器 再来看配置 请求路径 http://127.0.0.1:8080/appframework/services/catalog/catalogSpecials.json?pageindex1&pagesize10&pkidd98…

网络安全知识点整理(作业2)

目录 一、js函数声明->function 第一种 第二种 第三种 二、this关键字 this使用场合 1.全局环境 2.构造函数 3.对象的方法 避免多层this 三、js的同步与异步 定时器 setTimeout和setInterval 同步与异步的例子 四、宏任务与微任务 分辨宏任务与微任务 一、js…

深入解析项目管理中的用户流程图

介绍用户流程图 用户流程图的定义 用户流程图(User Flow Diagram)是一种可视化工具&#xff0c;它描绘了用户在应用或网站上完成任务的过程。这些任务可以是购物、注册账户、查找信息等&#xff0c;任何需要用户交互的动作都可以在用户流程图中找到。 用户流程图的重要性 用…

spring中常用的注解

前后端传值的注解 PathVariable和RequestParam PathVariable用于获取路径参数&#xff0c;RequestParam用于获取查询参数。 GetMapping("/klasses/{klassId}/teachers") public List<Teacher> getKlassRelatedTeachers(PathVariable("klassId") Lon…

我对排序算法的理解

排序算法一直是一个很困惑我的问题&#xff0c;早在刚开始接触 数据结构的时候&#xff0c;这个地方就很让我不解。就是那种&#xff0c;总是感觉少了些什么的感觉。一开始&#xff0c;重新来过&#xff0c;认真来学习这一部分&#xff0c;也总是学着学着就把概念记住了。过了一…

案例|会展大数据服务系统 智能服务体系建设实践

根据相关的市场调查发现在国内进行的2000多个会展项目中&#xff0c;仅有15%的项目能够提供相关主题网站基本业务和服务&#xff0c;且提供的服务并不能够满足会展各方的应用&#xff0c;剩余的大部门会展项目信息系统构建的不够完善、技术性差、应用复杂等&#xff0c;甚至提供…

三、JVM-如何判断对象已死问题

内存模型以及如何判定对象已死问题 体验与验证 2.4.5.1 使用visualvm visualgc插件下载链接 &#xff1a;https://visualvm.github.io/pluginscenters.html 选择对应JDK版本链接—>Tools—>Visual GC 若上述链接找不到合适的&#xff0c;大家也可以自己在网上下载对应…