顺序表(更新版)——“数据结构与算法”

news2025/1/18 2:03:56

各位CSDN的uu们你们好呀,今天小雅兰又来更新新专栏啦,其实之前我就已经写过了顺序表的内容,只是之前的内容不是最新版的顺序表,现在,我来更新一下最新版的顺序表,下面,就让我们进入更新版的顺序表的世界吧


顺序表和小雅兰之前写的三子棋、扫雷、通讯录一样,分为三个文件:

https://xiaoyalan.blog.csdn.net/article/details/128705747?spm=1001.2014.3001.5502

https://xiaoyalan.blog.csdn.net/article/details/128717749?spm=1001.2014.3001.5502

https://xiaoyalan.blog.csdn.net/article/details/128717749?spm=1001.2014.3001.5502

https://xiaoyalan.blog.csdn.net/article/details/129788167?spm=1001.2014.3001.5502

https://xiaoyalan.blog.csdn.net/article/details/129896970?spm=1001.2014.3001.5502

test.c——测试代码功能

SeqList.c——顺序表的实现

SeqList.h——顺序表的声明

 https://xiaoyalan.blog.csdn.net/article/details/129380414?spm=1001.2014.3001.5502

这是小雅兰之前写的顺序表的知识,有兴趣的可以去看看


我们写的是一个动态版的顺序表: 

typedef struct SeqList
{
	SLDataType* a;
	int size;//存储的有效数据的个数
	int capacity;//容量
}SL;

把struct SeqList这个结构体重命名为SL

typedef int SLDataType;

 把int重命名为SLDataType

写成这样的形式是因为:如果以后想要修改类型,那就直接改int就可以了,如果不这样写, ​​​​​​要改很多个地方,就很麻烦

顺序表的初始化:

//初始化
void SLInit(SL* ps1)
{
	ps1->a = malloc(sizeof(SLDataType) * 4);
	if (ps1 == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps1->size = 0;
	ps1->capacity = 4;
}

动态开辟出4个SLDataType类型的大小的空间

 顺序表的销毁:也就是把空间还给操作系统

//销毁
//把空间还给操作系统
void SLDestroy(SL* ps1)
{
	free(ps1->a);
	ps1->a = NULL;
	ps1->size = 0;
	ps1->capacity = 0;
}

打印顺序表的内容:

//打印
void SLPrint(SL* ps1)
{
	int i = 0;
	for (i = 0; i < ps1->size; i++)
	{
		printf("%d ", ps1->a[i]);
	}
	printf("\n");
}

尾插:

ps1->a[ps1->size] = x;
ps1->size++;

在这里,我们需要想一个问题:在尾插的过程中,如果空间不够了该怎么办呢???所以在这里,我们还需要一个检查容量的函数,如果容量不够就扩容

//检查容量,容量不够就扩容
void SLCheckCapacity(SL* ps1)
{
	if (ps1->size == ps1->capacity)
	{
		SLDataType* tmp = (SLDataType*)realloc(ps1->a, sizeof(SLDataType) * ps1->capacity * 2);
		//扩上一个二倍大小的容量
		//这个数值可以自己设定,扩多了不好,扩少了也不好
		//所以扩上二倍是最合理的选择
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps1->a = tmp;
		ps1->capacity = ps1->capacity * 2;
	}
}
//尾插
void SLPushBack(SL* ps1, SLDataType x)
{
	SLCheckCapacity(ps1);
	ps1->a[ps1->size] = x;
	ps1->size++;
}

下面,我们来测试一下尾插的功能,看是否成功

int main()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPushBack(&s, 6);
	SLPushBack(&s, 7);
	SLPushBack(&s, 8);
	SLPushBack(&s, 9);
	SLPushBack(&s, 10);
	SLPrint(&s);
	SLDestroy(&s);
	return 0;
}

 结果发现,尾插的功能非常成功!!!

头插:

需要从后往前挪动数据!!!

 若是从前往后挪动数据,就会覆盖,这是绝对不行的

//头插
void SLPushFront(SL* ps1, SLDataType x)
{
	SLCheckCapacity(ps1);
	//挪动数据
	int end = ps1->size - 1;
	while (end >= 0)
	{
		ps1->a[end + 1] = ps1->a[end];//把数据往后挪
		end--;
	}
	ps1->a[0] = x;
	ps1->size++;
}

来测试一下头插的功能:

//头插测试
void TestSeqList2()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushFront(&s, 5);
	SLPushFront(&s, 6);
	SLPushFront(&s, 7);
	SLPushFront(&s, 8);
	SLPushFront(&s, 9);
	SLPrint(&s);
	SLDestroy(&s);
}

 

 尾删:

 直接把size--就可以了

//尾删
void SLPopBack(SL* ps1)
{
	ps1->size--;
}

 来测试一下尾删的功能:

//尾删测试
void TestSeqList3()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushFront(&s, 5);
	SLPushFront(&s, 6);
	SLPushFront(&s, 7);
	SLPushFront(&s, 8);
	SLPushFront(&s, 9);
	SLPrint(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPrint(&s);
	SLDestroy(&s);
}

但是这个尾删仍然有点问题,需要检查一下:

//尾删
void SLPopBack(SL* ps1)
{
	//温柔的检查
	if (ps1->size == 0)
	{
		return;
	}
	ps1->size--;
}

//尾删
void SLPopBack(SL* ps1)
{
    //暴力的检查
	assert(ps1->size > 0);
	ps1->size--;
}

 头删:

//头删
void SLPopFront(SL* ps1)
{
	//暴力检查
	assert(ps1->size > 0);
	int start = 0;
	while (start < ps1->size - 1)
	{
		ps1->a[start] = ps1->a[start + 1];
		start++;
	}
	ps1->size--;
}

来测试一下头删的功能:

//头删测试
void TestSeqList4()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushFront(&s, 5);
	SLPushFront(&s, 6);
	SLPushFront(&s, 7);
	SLPushFront(&s, 8);
	SLPushFront(&s, 9);
	SLPrint(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPrint(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPrint(&s);
	SLDestroy(&s);
}

 

在中间位置插入数据:

//在中间位置(pos)插入数据
void SLInsert(SL* ps1, int pos, SLDataType x)
{
	SLCheckCapacity(ps1);
	int end = ps1->size - 1;
	while (end >= pos)
	{
		ps1->a[end + 1] = ps1->a[end];
		end--;
	}
	ps1->a[pos] = x;
	ps1->size++;
}

写了这个函数的功能之后,我们就可以把之前写的头插和尾插修改一下:

//尾插
void SLPushBack(SL* ps1, SLDataType x)
{
   SLInsert(ps1, ps1->size, x);
}
//头插
void SLPushFront(SL* ps1, SLDataType x)
{
   SLInsert(ps1, 0, x);
}

但是,这个在中间插入数据的代码还是有点问题;

//中间插数据测试
void TestSeqList5()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushFront(&s, 5);
	SLPushFront(&s, 6);
	SLPushFront(&s, 7);
	SLPushFront(&s, 8);
	SLPushFront(&s, 9);
	SLPrint(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPrint(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPrint(&s);
	SLInsert(&s, 2, 30);
	SLPrint(&s);
	SLInsert(&s, 20, 300);
	SLPrint(&s);
	SLDestroy(&s);
}

从此运行结果可知:越界是不会报错的!!!但是它的的确确越界了!!!

所以把代码改进为:

//在中间位置(pos)插入数据
void SLInsert(SL* ps1, int pos, SLDataType x)
{
	assert(pos >= 0 && pos <= ps1->size);
	SLCheckCapacity(ps1);
	int end = ps1->size - 1;
	while (end >= pos)
	{
		ps1->a[end + 1] = ps1->a[end];
		end--;
	}
	ps1->a[pos] = x;
	ps1->size++;
}

在中间位置删除数据:

//在中间位置(pos)删除数据
void SLErase(SL* ps1, int pos)
{
	assert(pos >= 0 && pos < ps1->size);
	assert(ps1->size > 0);//可有可无
	int start = pos + 1;
	while (start <= pos + 1)
	{
		ps1->a[start - 1] = ps1->a[start];
		start++;
	}
	ps1->size--;
}

同样,有了这个功能之后,可以把头删和尾删修改一下:

//头删
void SLPopFront(SL* ps1)
{
   SLErase(ps1, 0);
}
//尾删
void SLPopBack(SL* ps1)
{
   SLErase(ps1, ps1->size - 1);
}

测试一下从中间删除数据的功能:

//中间删数据测试
void TestSeqList6()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushFront(&s, 5);
	SLPushFront(&s, 6);
	SLPushFront(&s, 7);
	SLPushFront(&s, 8);
	SLPushFront(&s, 9);
	SLPrint(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPrint(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPrint(&s);
	SLInsert(&s, 2, 30);
	SLPrint(&s);
	SLErase(&s, 3);
	SLPrint(&s);
	SLDestroy(&s);
}

 

 查找:

//查找
//找到了返回下标,找不到返回-1
int SLFind(SL* ps1, SLDataType x)
{
	int i = 0;
	for (i = 0; i < ps1->size; i++)
	{
		if (ps1->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

修改:

//修改
void SLModify(SL* ps1, int pos, SLDataType x)
{
	assert(pos >= 0 && pos < ps1->size);
	ps1->a[pos] = x;
}

下面,浅浅附上一波源代码:

SeqList.c的内容

#include"SeqList.h"
//初始化
void SLInit(SL* ps1)
{
	assert(ps1);
	ps1->a = malloc(sizeof(SLDataType) * 4);
	if (ps1 == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps1->size = 0;
	ps1->capacity = 4;
}
//销毁
//把空间还给操作系统
void SLDestroy(SL* ps1)
{
	assert(ps1);
	free(ps1->a);
	ps1->a = NULL;
	ps1->size = 0;
	ps1->capacity = 0;
}
//打印
void SLPrint(SL* ps1)
{
	assert(ps1);
	int i = 0;
	for (i = 0; i < ps1->size; i++)
	{
		printf("%d ", ps1->a[i]);
	}
	printf("\n");
}
//检查容量,容量不够就扩容
void SLCheckCapacity(SL* ps1)
{
	assert(ps1);
	if (ps1->size == ps1->capacity)
	{
		SLDataType* tmp = (SLDataType*)realloc(ps1->a, sizeof(SLDataType) * ps1->capacity * 2);
		//扩上一个二倍大小的容量
		//这个数值可以自己设定,扩多了不好,扩少了也不好
		//所以扩上二倍是最合理的选择
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps1->a = tmp;
		ps1->capacity = ps1->capacity * 2;
	}
}
//在中间位置(pos)插入数据
void SLInsert(SL* ps1, int pos, SLDataType x)
{
	assert(ps1);
	assert(pos >= 0 && pos <= ps1->size);
	SLCheckCapacity(ps1);
	int end = ps1->size - 1;
	while (end >= pos)
	{
		ps1->a[end + 1] = ps1->a[end];
		end--;
	}
	ps1->a[pos] = x;
	ps1->size++;
}
//在中间位置(pos)删除数据
void SLErase(SL* ps1, int pos)
{
	assert(ps1);
	assert(pos >= 0 && pos < ps1->size);
	assert(ps1->size > 0);//可有可无
	int start = pos + 1;
	while (start <= pos + 1)
	{
		ps1->a[start - 1] = ps1->a[start];
		start++;
	}
	ps1->size--;
}
//尾插
void SLPushBack(SL* ps1, SLDataType x)
{
	assert(ps1);
	/*SLCheckCapacity(ps1);
	ps1->a[ps1->size] = x;
	ps1->size++;*/
	SLInsert(ps1, ps1->size, x);
}
//头插
void SLPushFront(SL* ps1, SLDataType x)
{
	assert(ps1);
	//SLCheckCapacity(ps1);
	挪动数据
	//int end = ps1->size - 1;
	//while (end >= 0)
	//{
	//	ps1->a[end + 1] = ps1->a[end];//把数据往后挪
	//	end--;
	//}
	//ps1->a[0] = x;
	//ps1->size++;
	SLInsert(ps1, 0, x);
}
//尾删
void SLPopBack(SL* ps1)
{
	assert(ps1);
	温柔的检查
	//if (ps1->size == 0)
	//{
	//	return;
	//}
	//ps1->size--;
	//暴力的检查
	/*assert(ps1->size > 0);
	ps1->size--;*/
	SLErase(ps1, ps1->size - 1);
}
//头删
void SLPopFront(SL* ps1)
{
	assert(ps1);
	//暴力检查
	assert(ps1->size > 0);
	int start = 0;
	while (start < ps1->size - 1)
	{
		ps1->a[start] = ps1->a[start + 1];
		start++;
	}
	ps1->size--;
	//SLErase(ps1, 0);
}
//查找
//找到了返回下标,找不到返回-1
int SLFind(SL* ps1, SLDataType x)
{
	assert(ps1);
	int i = 0;
	for (i = 0; i < ps1->size; i++)
	{
		if (ps1->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}
//修改
void SLModify(SL* ps1, int pos, SLDataType x)
{
	assert(ps1);
	assert(pos >= 0 && pos < ps1->size);
	ps1->a[pos] = x;
}

SeqList.h的内容

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//动态顺序表
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;
	int size;//存储的有效数据的个数
	int capacity;//容量
}SL;
//初始化
void SLInit(SL* ps1);
//销毁
//把空间还给操作系统
void SLDestroy(SL* ps1);
//打印
void SLPrint(SL* ps1);
//尾插
void SLPushBack(SL* ps1,SLDataType x);
//尾删
void SLPopBack(SL* ps1);
//头插
void SLPushFront(SL* ps1, SLDataType x);
//头删
void SLPopFront(SL* ps1);
//在中间位置(pos)插入数据
void SLInsert(SL* ps1, int pos, SLDataType x);
//在中间位置(pos)删除数据
void SLErase(SL* ps1, int pos);
//查找
//找到了返回下标,找不到返回-1
int SLFind(SL* ps1, SLDataType x);
//修改
void SLModify(SL* ps1, int pos, SLDataType x);

test.c的内容

void menu()
{
	printf("***********************************************************\n");
	printf("1、尾插数据             2、尾删数据\n");
	printf("\n");
	printf("3、头插数据             4、头删数据\n");
	printf("\n");
	printf("5、在任意位置插入数据(位置3插入20)\n");
	printf("\n");
	printf("6、在任意位置删除数据              \n");
	printf("\n");
	printf("7、查找某个数据的位置,并删除它     \n");
	printf("\n");
	printf("8、删除顺序表中有的 某个数据        \n");
	printf("\n");
	printf("9、打印数据                       \n");
	printf("\n");
	printf("-1、退出                          \n");
	printf("\n");
	printf("***********************************************************\n");

}

int main()
{
	printf("*************  欢迎大家来到动态顺序表的测试  **************\n");
	int option = 0;
	SL s;
	SLInit(&s);
	do
	{
		menu();
		printf("请输入你的操作:>");
		scanf_s("%d", &option);
		int sum = 0;
		int x = 0;
		int y = 0;
		int z = 0;
		int pos = 0;
		int w = 0;
		switch (option)
		{
		case 1:
			printf("请依次输入你要尾插的数据:,以-1结束\n");
			scanf_s("%d", &sum);
			while (sum != -1)
			{
				SLPushBack(&s, sum);    // 1.尾插
				scanf_s("%d", &sum);
			}
			break;
		case 2:
			SLPopBack(&s);             // 2.尾删
			break;
		case 3:
			scanf_s("%d", &x);
			SLPushFront(&s, x);       // 3.头插
			break;
		case 4:
			SLPopFront(&s);           // 4.头删
			break;
		case 5:
			SLInsert(&s, 3, 20);     // 5.在任意位置插入数据
			break;
		case 6:
			SLErase(&s, 3);          // 6.在任意位置删除数据
			break;
		case 7:
			printf("请输入要删除序列的中的某个数字\n");
			scanf_s("%d", &z);
			y = SLFind(&s, z);        // 7.查找某个数字的位置,并且删除它
			printf("%d的位置在%d处: \n", z, y);
			if (y != -1)
			{
				SLErase(&s, y);
			}
			break;
		case 8:
			printf("请输入要删除序列的中的数字\n");  //8.删除顺序表中 所有的 某个数据 
			scanf_s("%d", &w);
			pos = SLFind(&s, w, 0);
			while (pos != -1)
			{
				SLErase(&s, pos);
				pos = SLFind(&s, w, pos);
			}
			break;
		case 9:
			SLPrint(&s);
			break;
		default:
			if (option == -1)
			{
				exit(0);  // 退出程序 
			}
			else
			{
				printf("输入错误,请重新输入\n");
			}
			break;

		}
	} while (option != -1);   // 退出程序
	SLDestroy(&s);
	return 0;
}

好啦,小雅兰今天的顺序表的更新版的内容就到这里啦,继续加油刷题和学习算法噢!!!

 

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

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

相关文章

开发常用的 Linux 命令1(文件和目录)

开发常用的 Linux 命令汇总1&#xff08;文件和目录&#xff09; 作为开发者&#xff0c;Linux是我们必须掌握的操作系统之一。因此&#xff0c;在编写代码和部署应用程序时&#xff0c;熟练使用Linux命令非常重要。这些常用命令不得不会&#xff0c;掌握这些命令&#xff0c;…

小项目发布:TLC_Browers--一个开源的基于vb6基于Webview2 Runtime支持html5和多标签的浏览器

项目名称:TLC浏览器(TLC_NLP机器人的附属产品) 技术架构:webview2 runtime,可参考链接WebView2 - Microsoft Edge Developer 目录介绍: kernel:控制webview2内核的代码 client:主程序代码&#xff0c;将kernel变为自己的子窗体&#xff0c; 进程通信方式:共享文件 release:正…

Jenkins 在linux安装配置

下载Jenkins 安装包 官网地址&#xff1a;https://www.jenkins.io/index.html 因为我的是centos&#xff0c;所以我选择redhat的长期支持版本 linux上执行&#xff1a; wget https://get.jenkins.io/redhat-stable/jenkins-2.222.1-1.1.noarch.rpm安装 使用rpm安装&#xf…

【Linunx报错】程序在运行时无法找到一个名为 “libctemplate.so.3“ 的共享库文件

第一个报错&#xff1a; error while loading shared libraries: libctemplate.so.3: cannot open shared object file: No such file or directory 解决方法&#xff1a; 这个错误信息提示你的程序在运行时无法找到一个名为 “libctemplate.so.3” 的共享库文件&#xff0c;因…

GAMES302等几何分析(IGA)---- 课程简介及等几何分析的介绍

文章目录 前言提纲产品数字化设计\仿真\优化全流程介绍计算机辅助设计&#xff08;CAD&#xff09;NURBS理论基础计算机辅助工程&#xff08;CAE&#xff09;什么是CAE为什么用CAECAE典型应用CAE解决问题的一般过程CAE方法体系及软件 结构优化创成式设计设计仿真类工业软件国产…

mybatis注解的详解和开发(增、删、改、查以及一对一、一对多/多对一、多对多的关系联查)

mybatis注解的基本理解和开发(增、删、改、查以及一对一、一对多/多对一、多对多的关系联查) 使用mybatis注解开发的原因&#xff1f; 注解提供了一种简单的方式来实现简单映射语句&#xff0c;而不会引入大量的开销。能够读懂别人写的代码&#xff0c;特别是框架相关的代码。…

Java——反转链表

题目链接 牛客在线oj题——反转链表 题目描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤n≤1000 要求&#xff1…

OpenAI最新官方ChatGPT聊天插件接口《插件示例demo》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(四)(附源码)

Example plugins 插件示例demo 前言Introduction 导言Learn how to build a simple todo list plugin with no auth 了解如何构建一个简单的待办事项列表插件&#xff0c;无需授权Learn how to build a simple todo list plugin with service level auth 了解如何构建一个简单的…

【Unity VR开发】结合VRTK4.0:瞬移点

语录&#xff1a; 如果把童年再放映一遍&#xff0c;我们一定会先大笑&#xff0c;然后放声痛哭&#xff0c;最后挂着泪&#xff0c;微笑着睡去。 前言&#xff1a; 移动的限制除了设置移动区域&#xff0c;也可以使用瞬移点&#xff1a;Locomotors.TeleportTargets.Point。 正…

HQChart报价列表高级应用教程7-创建走势图列

HQChart报价列表高级应用教程7-创建走势图列 走势图列效果图步骤1. 走势图列数据截图数据结构HQChart代码地址走势图列 在行情报价里面,使用单独的一列显示每一个股票的价格走势的缩略图。 效果图 步骤 1. 走势图列 REPORT_COLUMN_ID.CLOSE_LINE_ID 走势图列在创建报价列…

ChatGPT: 人工智能对话模型的前沿技术与应用探析

ChatGPT: 人工智能对话模型的前沿技术与应用探析 引言 ChatGPT作为一种人工智能对话模型&#xff0c;在近年来引起了广泛的关注和研究。随着人工智能技术的不断发展&#xff0c;ChatGPT作为一种前沿技术在人机对话领域具有重要地位和广泛的应用价值。本文将介绍ChatGPT的背景和…

【CocosCreator入门】CocosCreator组件 | ProgressBar(进度条)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的ProgressBar组件是一种用于实现进度条效果的重要组件。它可以让我们在游戏中展示各种进度条效果&#xff0c;例如加载进度条、血条等。 目录 一、组件介绍 二、组件属性 三、脚本…

如何删除docker镜像与容器

目录 删除示例&#xff1a; 1.查看docker中要删除的镜像 2.删除镜像&#xff0c;使用命令“docker rmi image id” 3.查看docker中正在运行的容器 4.停止容器 5.删除容器 6.查看容器 7.删除镜像 8.最后查看所有镜像 删除示例&#xff1a; 1.查看docker中要删除的镜像 …

(二)Jhipster 快速搭建微服务

&#xff08;一&#xff09;Jhipster 的简介与安装https://blog.csdn.net/weixin_46085718/article/details/130282249 目录 &#xff08;一&#xff09;Jhipster 的简介与安装 1、搭建注册中心 jhipster registry jhipster registry是一个基于spring cloud的配置中心。所有…

跟寻智能色选机,一起探索神秘的色彩世界

色选机&#xff0c;一种基于物料颜色、形状或质地差异&#xff0c;再通过光电检测、图像处理等手段来实现物料分选和净化的工业化应用终端&#xff0c;可满足特种物料等多种产品的色选要求&#xff0c;如大米、茶叶、豆类、药材、种子、虾皮、坚果、各类干货、塑料、珠宝、矿石…

【Python入门第五十二天】Python丨NumPy 数组过滤

数组过滤 从现有数组中取出一些元素并从中创建新数组称为过滤&#xff08;filtering&#xff09;。 在 NumPy 中&#xff0c;我们使用布尔索引列表来过滤数组。 布尔索引列表是与数组中的索引相对应的布尔值列表。 如果索引处的值为 True&#xff0c;则该元素包含在过滤后的…

随想录Day57--动态规划: 647. 回文子串 , 516.最长回文子序列

回文串和最长回文子串&#xff0c;关键在于dp数组的定义&#xff0c;以及中间的关系式和递推公式怎么表达。代码其实很简单&#xff0c;但最重要的是思路&#xff01;&#xff01;&#xff01; 回文子串dp是布尔型&#xff0c;遍历所有情况找到所有的true&#xff0c;最长回文…

蓝奥声核心技术分享——基于物联网的能源监测数据采集技术

1.技术背景 基于物联网的能源监测数据采集技术主要解决物联网能源监测节点面向目标对象以协同方式进行能源监测数据采集的问题&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及无线物联网边缘智能与测控的技术领域&…

【CocosCreator入门】CocosCreator组件 | EditBox(文本输入)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的EditBox组件是一种用于实现用户输入交互的重要组件。它可以让用户在游戏中输入文字、数字等内容&#xff0c;并且可以对输入内容进行格式校验和处理。 目录 一、组件介绍 二、组件…

【Unity渲染】URP透明物体自身渲染穿插异常问题

背景&#xff1a; 对于URP中的某个物体&#xff0c;我们如果希望他正反面都可以被渲染。 通常会有两种解决方案&#xff1a; 1.将网格设置为双面网格。&#xff08;此种情况Mesh.RecalculateNormals计算结果可能会异常&#xff0c;解决可参考网格法线生成异常解决&#xff0…