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

学习笔记---超基础+详细+新手的顺序表~~


目录

1.顺序表的前言

1.1 顺序表--->通讯录📇

1.2 数据结构的相关概念🏇

1.2.1 什么是数据结构

1.2.1 为什么需要数据结构

2. 顺序表概念及分类

2.1 顺序表的概念🐙

2.2 顺序表的分类🐫

2.2.1 顺序表和数组的区别

2.2.2 顺序表分类

1.静态顺序表

2. 动态顺序表 

3. 实现动态顺序表

3.1 要实现的目标🫵

3.2 创建(初始化)顺序表🌺

3.2.1 Seqlist.h

3.2.2 Seqlist.c

3.2.3 test.c

3.2.4 代码测试

3.3 销毁💥

3.3.1 Seqlist.h

3.3.2 Seqlist.c

3.3.3 test.c

3.3.4 代码测试

3.4 尾部插入数据🌈+打印顺序表

3.4.0 思路分析

3.4.1 Seqlist.h

3.4.2 Seqlist.c

3.4.3 test.c

3.4.4 代码测试

3.5 头部插入数据💫

3.5.0 思路分析

3.5.1 Seqlist.h

3.5.2 Seqlist.c

3.5.3 test.c

3.5.4 代码运行测试

3.6 尾部删除数据⛄️

3.6.0 思路分析

3.6.1 Seqlist.h

3.6.2 Seqlist.c

3.6.3 test.c

3.6.4 代码运行测试

​编辑

3.7 头部删除数据🌊

3.7.0 思路分析

3.7.1 Seqlist.h

3.7.2 Seqlist.c

3.7.3 test.c

3.7.4 代码运行测试

3.8 指定位置之前插入数据🍿

3.8.0 思路分析

3.8.1 Seqlist.h

3.8.2 Seqlist.c

3.8.3 test.c

3.8.4 代码运行测试

3.9 指定位置删除数据⚾️

3.9.0 思路分析

3.9.1 Seqlist.h

3.9.2 Seqlist.c

3.9.3 test.c

3.9.4 代码运行测试

4.0 查找数据🍺

4.0.1 Seqlist.h

4.0.2 Seqlist.c

4.0.3 test.c

4.0.4 代码运行测试
​​​​​​​​​​​​​​


1.顺序表的前言

1.1 顺序表--->通讯录📇

我们前面学习了C语言,它能够帮助我们实现通讯录📇项目,要想实现通讯录项⽬有两个技术关键:

1)C语⾔语法基础

2)数据结构之顺序表/链表(链表我们下下期讲)

1.2 数据结构的相关概念🏇

1.2.1 什么是数据结构

数据结构是计算机存储、组织数据的⽅式

数据肉眼可见的信息,例如:数值1,2......  网页信息......

结构:借助数组这样的数据结构将⼤量的同一类型的数据组织在⼀起

总结:

1)能够存储数据(如顺序表、链表等结构)

2)存储的数据能够⽅便查找


1.2.1 为什么需要数据结构

我们要知道最简单的数据结构是数组

通过数据结构,能够有效将数据组织和管理在⼀起。按照我们的⽅式任意对数据进⾏增删改查等操作。


但是,数组不满足于复杂场景数据的管理:

1.数组仅存储同类型的数据  eg.int  arr[10]     char  arr[10]

2.数组可提供的接口不足以支撑复杂场景的数据处理--->这就是为什么我们要学习其他的数据结构:通过数据结构,我们可以先写出底层逻辑,然后直接调用。例如C语言的sizeof

2. 顺序表概念及分类

2.1 顺序表的概念🐙

顺序表是线性表的一种。(他们的关系可以类比于西瓜🍉和水果的关系(包含关系))

线性表指的是具有相同特性的一类数据结构的总称。常⻅的线性表:顺序表、链表、栈、队列、字符串... 

相同特性:逻辑结构一定是线性的,在物理结构不一定是线性的

逻辑结构人为想象出来的,排列起来成线性,例如排队在逻辑结构上就是线性的(像一条线一样排列)

物理结构内存存储上按照线性排列,例如数组的每个元素地址在物理结构上就是线性的(相邻元素地址是连续的)

顺序表的底层结构是数组--->顺序表逻辑结构一定是线性的,在物理结构上也一定是线性的

2.2 顺序表的分类🐫

2.2.1 顺序表和数组的区别

◦ 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝

2.2.2 顺序表分类

1.静态顺序表

概念:使⽤定⻓数组存储元素

//静态顺序表
struct Seqlist
{
int a[100];//定长数组
int size;//有效数据个数
}

静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费


2. 动态顺序表 

概念:使⽤动态数组存储元素

//动态顺序表
struct Seqlist
{
int* a;//动态数组
int size;//有效数据个数
int capacity;//空间大小
}

动态顺序表优点:按需申请空间,不造成浪费或者不够用,还可以扩容


3. 实现动态顺序表

这里,我们需要创建头文件和源文件

头文件:结构的实现和声明,函数的声明

源文件:函数的具体实现和代码运行的测试

从而,更加方便第三方使用

3.1 要实现的目标🫵

我们需要多个接口帮助我们实现:创建(初始化)、一系列具体操作、销毁

具体操作(一切以实现通讯录为目标)包括:头部/尾部插入数据、头部/尾部删除数据、打印出顺序、指定位置插入/删除/查找数据、


3.2 创建(初始化)顺序表🌺

3.2.1 Seqlist.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
//创建动态顺序表
typedef int SLDataType;//方便以后修改数据类型,因为我们不一定每次都需要int类型
typedef struct Seqlist
{SLDataType* a;//动态数组int size;//有效数据个数int capacity;//空间大小
}SL;//重命名顺序表名称,更加简短方便输入//对顺序表初始化
void SLInit(SL* sl);//初始化的函数声明,注意传址调用--->否则形参只是实参的临时拷贝

3.2.2 Seqlist.c

#include"Seqlist.h"
void SLInit(SL* sl)
{sl->a = NULL;sl->size = sl->capacity = 0;
}

3.2.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{SL sl;SLInit(&sl);
}
int main()
{SLtest();return 0;
}

3.2.4 代码测试


3.3 销毁💥

3.3.1 Seqlist.h

//对顺序表销毁
void SLDestroy(SL* sl);//函数声明

3.3.2 Seqlist.c

注意⚠️

assert(断言)也可以判断sl->a是否是NULL,但是assert比较暴力,会导致程序直接终止,而下面的方法不会影响后面的程序

//对顺序表销毁
void SLDestroy(SL* sl)
{if (sl->a)free(sl->a);sl->a = NULL;sl->size = sl->capacity = 0;
}

3.3.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

3.3.4 代码测试


3.4 尾部插入数据🌈+打印顺序表

3.4.0 思路分析

由于尾插/头插都需要判断空间够不够,所以我们直接把判断空间十分足够的函数单提出来


对怎样扩容的进一步解释:


3.4.1 Seqlist.h

//打印顺序表
void SLPrint(SL* sl);//尾部插入数据
void SLPushBack(SL* sl, SLDataType x);

3.4.2 Seqlist.c

//判断空间是否足够
void SLCheckCapacity(SL* sl)
{if (sl->size == sl->capacity) {//空间不足,扩容2倍//判断sl->capacity是否为0int newcapacity = sl->capacity == 0 ? 4 : 2 * sl->capacity;//判断原空间是否是0,不是直接*2扩容,是0直接赋值4SLDataType* tmp = (SLDataType*)realloc(sl->a, newcapacity * 2 * sizeof(SLDataType));//采用中间值tmp接收扩容的新空间--->申请空间也不一定成功,如果我们直接让ps->a接收,//但是扩容失败了,那么ps->a的空间直接变成0了//所以我们需要判断一下扩容是否成功if (tmp == NULL){perror("realloc fail!\n");return 1;}sl->a = tmp;//sl->capacity *=2;错误--->因为前面我们初始化sl->capacity=0,0*2=0--->报错--->判断一下sl->capacity是否为0sl->capacity = newcapacity;//记录现有空间大小}
}
//尾部插入数据
void SLPushBack(SL* sl, SLDataType x)
{assert(sl);//不能传过来空指针SLCheckCapacity(sl);//判断空间是否足够//插入数据sl->a[sl->size++] = x;
}//打印顺序表
void SLPrint(SL* sl)
{for (int i = 0; i < sl->size; i++){printf("%d ", sl->a[i]);}printf("\n");
}

3.4.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//尾插测试SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);//打印SLPrint(&sl);//销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

3.4.4 代码测试


3.5 头部插入数据💫

3.5.0 思路分析

思路和尾插类似,只不过插入数据的位置变了


3.5.1 Seqlist.h

//头部插入数据
void SLPushFront(SL* sl, SLDataType x);

3.5.2 Seqlist.c

//头部插入数据
void SLPushFront(SL* sl, SLDataType x)
{assert(sl);SLCheckCapacity(sl);//判断空间是否足够//插入数据for (int i = sl->size - 1; i >=0 ; i--){//最后一次进来的是i=0sl->a[i + 1] = sl->a[i];}sl->a[0] = x;sl->size++;
}

3.5.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//尾插测试SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);//打印SLPrint(&sl);//1 2 3 4//头插测试SLPushFront(& sl, 5);//打印SLPrint(&sl);//5 1 2 3 4//销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

3.5.4 代码运行测试


3.6 尾部删除数据⛄️

3.6.0 思路分析


3.6.1 Seqlist.h

//尾部删除数据
void SLPopBack(SL* sl);

3.6.2 Seqlist.c

bool SLIsEmpty(SL* sl)
{//判断顺序表是否为空assert(sl);return sl->size == 0;
}
//尾部删除数据
void SLPopBack(SL* sl)
{assert(sl);assert(!SLIsEmpty(sl));//顺序表不能为空sl->size--;
}

3.6.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//尾插测试SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);//打印SLPrint(&sl);//1 2 3 4//头插测试SLPushFront(& sl, 5);//打印SLPrint(&sl);//5 1 2 3 4//尾删测试//尾部删除数据SLPopBack(&sl);//打印SLPrint(&sl);//5 1 2 3 //销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

3.6.4 代码运行测试


3.7 头部删除数据🌊

3.7.0 思路分析

我们需要将后面的数据往前移动一位


3.7.1 Seqlist.h

//头部删除数据
void SLPopFront(SL* sl);

3.7.2 Seqlist.c

//头部删除数据
void SLPopFront(SL* sl)
{assert(sl);assert(!SLIsEmpty(sl));//顺序表不能为空for (int i = 0; i < sl->size-1; i++){//最后一次进来的是size-2sl->a[i] = sl->a[i + 1];}sl->size--;
}

3.7.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//尾插测试SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);//打印SLPrint(&sl);//1 2 3 4//头插测试SLPushFront(& sl, 5);//打印SLPrint(&sl);//5 1 2 3 4//尾删测试//尾部删除数据SLPopBack(&sl);//打印SLPrint(&sl);//5 1 2 3 //头部删除数据SLPopFront(&sl);//打印SLPrint(&sl);// 1 2 3//销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

3.7.4 代码运行测试


3.8 指定位置之前插入数据🍿

3.8.0 思路分析


3.8.1 Seqlist.h

//指定位置之前插入数据
void SLInsert(SL* sl, int pos, SLDataType x);

3.8.2 Seqlist.c

//指定位置之前插入数据
void SLInsert(SL* sl, int pos, SLDataType x)
{assert(sl);assert(pos >= 0 && pos <= sl->size);//pos确保合法SLCheckCapacity(sl);//判断空间是否足够--->是否需要扩容for (int i = sl->size - 1; i > pos - 1; i--){//最后进来的是possl->a[i+1] = sl->a[i];}sl->a[pos]=x;sl->size++;
}

3.8.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//尾插测试SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);//打印SLPrint(&sl);//1 2 3 4//头插测试SLPushFront(& sl, 5);//打印SLPrint(&sl);//5 1 2 3 4//尾删测试//尾部删除数据SLPopBack(&sl);//打印SLPrint(&sl);//5 1 2 3 //头部删除数据SLPopFront(&sl);//打印SLPrint(&sl);// 1 2 3//指定位置之前插入数据SLInsert(&sl, 1, 4);//打印SLPrint(&sl);// 4 1 2 3//销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

3.8.4 代码运行测试


3.9 指定位置删除数据⚾️

3.9.0 思路分析


3.9.1 Seqlist.h

//指定位置删除数据
void SLErase(SL* sl, int pos);

3.9.2 Seqlist.c

//指定位置删除数据
void SLErase(SL* sl, int pos)
{assert(sl);assert(!SLIsEmpty(sl));//顺序表若为空--->不能删除assert(pos >= 0 && pos <= sl->size);//pos确保合法for (int i = pos; i <sl->size-1 ; i++){//最后进来的是size-2sl->a[i] = sl->a[i + 1];}sl->size--;
}

3.9.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//尾插测试SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);//打印SLPrint(&sl);//1 2 3 4//头插测试SLPushFront(& sl, 5);//打印SLPrint(&sl);//5 1 2 3 4//尾删测试//尾部删除数据SLPopBack(&sl);//打印SLPrint(&sl);//5 1 2 3 //头部删除数据SLPopFront(&sl);//打印SLPrint(&sl);// 1 2 3//指定位置之前插入数据SLInsert(&sl,0,4);//打印SLPrint(&sl);// 4 1 2 3//指定位置删除数据SLErase(&sl, 2);//打印SLPrint(&sl);// 4 1 3//销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

3.9.4 代码运行测试


4.0 查找数据🍺

4.0.1 Seqlist.h

//查找数据
bool SLFind(SL* sl, SLDataType x);

4.0.2 Seqlist.c

//查找数据
bool SLFind(SL* sl, SLDataType x)
{assert(sl);for (int i = 0; i < sl->size; i++){if (sl->a[i] == x)return true;}return false;
}

4.0.3 test.c

#include"Seqlist.h"
void SLtest()//测试创建的顺序表和初始化的接口
{//初始化测试SL sl;SLInit(&sl);//尾插测试SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);//打印SLPrint(&sl);//1 2 3 4//头插测试SLPushFront(& sl, 5);//打印SLPrint(&sl);//5 1 2 3 4//尾删测试//尾部删除数据SLPopBack(&sl);//打印SLPrint(&sl);//5 1 2 3 //头部删除数据SLPopFront(&sl);//打印SLPrint(&sl);// 1 2 3//指定位置之前插入数据SLInsert(&sl,0,4);//打印SLPrint(&sl);// 4 1 2 3//指定位置删除数据SLErase(&sl, 2);//打印SLPrint(&sl);// 4 1 3//查找数据测试bool ret=SLFind(&sl, 3);if (ret){printf("找到了!\n");}else{printf("没找到!\n");}//销毁测试SLDestroy(&sl);
}int main()
{SLtest();return 0;
}

4.0.4 代码运行测试


本次的分享到这里就结束了!!!

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!

如果对你有帮助的话,记得点赞👍+收藏⭐️+关注➕

相关文章:

学习笔记---超基础+详细+新手的顺序表~~

目录 1.顺序表的前言 1.1 顺序表--->通讯录&#x1f4c7; 1.2 数据结构的相关概念&#x1f3c7; 1.2.1 什么是数据结构 1.2.1 为什么需要数据结构 2. 顺序表概念及分类 2.1 顺序表的概念&#x1f419; 2.2 顺序表的分类&#x1f42b; 2.2.1 顺序表和数组的区别 2.…...

Java高级-CompletableFuture并发编程利器

CompletableFuture核心Api 1.概述2.Async2.a) supplyAsync2.b) runAsync 3.Then3.a) thenApply()3.b) thenApplyAsync() 1.概述 Future可以在并发编程中异步获取结果 CompletableFuture实现了Future接口&#xff0c;肯定也会有Future的功能&#xff0c;也相当于是Future的一个…...

python、java、c++哪一个前景比较好?

Python是一种广泛使用的高级编程语言&#xff0c;适用于数据分析、人工智能、机器学习等领域。Java是一种通用的编程语言&#xff0c;适用于企业级应用开发、网站开发、软件开发、嵌入式领域等。C是一种系统编程语言&#xff0c;适用于嵌入式开发、游戏开发、音视频、服务端开发…...

【排序算法】详解直接插入排序和希尔排序原理及其性能分析

文章目录 插入排序算法原理细节分析代码实现复杂度分析:稳定性分析:与冒泡排序的对比 希尔排序算法原理细节分析代码实现复杂度分析稳定性分析 总结对比 插入排序 算法原理 插入排序又或者说直接插入排序,是一种和冒泡排序类似的并且比较简单的排序方法&#xff0c; 基本思想…...

JDK1.8对HashMap的优化、以及通过源码解析1,8扩容机制

JDK 1.8 对 HashMap 进行了一些优化&#xff0c;主要包括以下几个方面的改进&#xff1a; 红黑树&#xff1a;在 JDK 1.8 中&#xff0c;当哈希碰撞&#xff08;多个键映射到同一个桶&#xff09;达到一定程度时&#xff0c;HashMap 会将链表转化为红黑树&#xff0c;以提高查找…...

Linux串口断帧处理

报文格式 1 Byte 4 Byte N Byte 4 Byte 1 Byte 0x02 报文长度 报文 CRC16 0x03 1. 每条报文以 STX&#xff08;0x02&#xff09;起始符开始&#xff0c;以 ETX&#xff08;0x03&#xff09;终止符结束。 2. 报文正文长度采用 4 字节的 10 进制字符串标识&#xff0c;如报文正…...

springboot集成kafka

1、引入依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.6</version></dependency> 2、配置 server:port: 9099 spring:kafka:bootstrap-servers: 192.1…...

近期总结2023.10.16

规律 1.两数相减&#xff0c;相加的最大&#xff0c;最小值 2.由最初的状态递推 3.无强制顺序&#xff0c;排序,不能排序&#xff0c;则与顺序有关 4.对于一段等差数列&#xff0c;不用一段一段的算局部整体&#xff0c;可以从整体一步步加差值 5.需要从一段式子推到结果困难&…...

【EI会议征稿】第二届可再生能源与电气科技国际学术会议(ICREET 2023)

第二届可再生能源与电气科技国际学术会议(ICREET 2023) 2023 2nd International Conference on Renewable Energy and Electrical Technology 2020年中国可再生能源发电规模显著扩大&#xff0c;风力和太阳能发电均呈迅速增长趋势。中国大力推进能源低碳化&#xff0c;减少温…...

让ChatGPT等模型学会自主思考!开创性技术“自主认知”框架

ChatGPT、百度文心一言、Bard等大语言模型展现出了超强的创造能力&#xff0c;加速了生成式AI的应用进程。但AI模型只能基于训练数据执行各种任务&#xff0c;无法像人类一样利用生活知识、过往经验用于复杂的推理和决策。 例如&#xff0c;在玩游戏时&#xff0c;人类可以利用…...

Jmeter脚本参数化和正则匹配

我们在做接口测试过程中&#xff0c;往往会遇到以下几种情况 每次发送请求&#xff0c;都需要更改参数值为未使用的参数值&#xff0c;比如手机号注册、动态时间等 上一个接口的请求体参数用于下一个接口的请求体参数 上一个接口的响应体参数用于下一个接口的请求体参数&#…...

vue 请求代理 proxy

目录 为什么需要配置代理 什么是同源策略 如何配置代理 请求代理的原理 举例说明 为什么需要配置代理 因为浏览器的同源策略&#xff0c;当向和本地 devServer 服务器不同源的地址发送请求&#xff0c; 会违反浏览器的同源策略&#xff0c;导致发送失败&#xff0c;所以需…...

使用Spring Boot构建稳定可靠的分布式爬虫系统

摘要&#xff1a;本文将介绍如何使用Spring Boot框架构建稳定可靠的分布式爬虫系统。我们将从系统设计、任务调度、数据存储以及容灾与故障恢复等方面进行详细讲解&#xff0c;帮助读者理解并实践构建高效的分布式爬虫系统。 1. 引言 随着互联网的快速发展&#xff0c;爬虫系…...

分享一个查询OpenAI Chatgpt key余额查询的工具网站

OpenAI Key 余额查询工具 欢迎使用 OpenAI Key 余额查询工具网站&#xff01;这个工具可以帮助您轻松地验证您的 OpenAI API 密钥&#xff0c;并查看您的余额。 http://tools.lbbit.top/check_key/ 什么是 OpenAI Key 余额查询工具&#xff1f; OpenAI Key 余额查询工具是一…...

【LeetCode刷题(数据结构与算法)】:二叉树的后序遍历

给你一棵二叉树的根节点root 返回其节点值的后序遍历 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[1]…...

内网、外网、宽带、带宽、流量、网速之间的区别与联系

一.带宽与宽带的区别是什么&#xff1f; 带宽是量词&#xff0c;指的是网速的大小&#xff0c;比如1Mbps的意思是一兆比特每秒&#xff0c;这个数值就是指带宽。 宽带是名词&#xff0c;说明网络的传输速率速很高 。宽带的标准各不相同&#xff0c;最初认为128kbps以上带宽的就…...

打造类ChatGPT服务,本地部署大语言模型(LLM),如何远程访问?

ChatGPT的成功&#xff0c;让越来越多的人开始关注大语言模型&#xff08;LLM&#xff09;。如果拥有了属于自己的大语言模型&#xff0c;就可以对其进行一些专属优化。例如&#xff1a;打造属于自己的AI助理&#xff0c;或是满足企业自身的业务及信息安全需求。 所以&#xff…...

linux平台的无盘启动开发

by fanxiushu 2023-10-15 转载或引用请注明原始作者。 前一章节介绍的是linux平台下的虚拟磁盘驱动开发过程&#xff0c;主要讲述了 基于block的磁盘和基于SCSI接口的磁盘。 本文介绍的内容正是基于上文中的SCSI接口的虚拟磁盘实现的无盘启动。 同样的&#xff0c;linux系统下也…...

【GO入门】环境配置及Vscode配置

1 GO环境配置 欢迎来到Go的世界&#xff0c;让我们开始探索吧&#xff01; Go是一种新的语言&#xff0c;一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点&#xff1a; 它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。Go为软件构造提供了一种模型&…...

家政服务小程序,家政维修系统,专业家政软件开发商;家政服务小程序,家政行业软件开发

家政服务小程序&#xff0c;家政维修系统&#xff0c;专业家政软件开发商&#xff1b; 家政服务小程序&#xff0c;家政行业软件开发解决方案&#xff0c;家政软件经验丰富实践&#xff0c;系统高度集成&#xff0c;提供师傅端、用户端、… 家政服务app开发架构有 1、后台管理端…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

HTML版英语学习系统

HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具&#xff0c;使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章&#xff0c;系统朗读帮助练习听力和发音&#xff0c;适合跟读练习&#xff0c;模仿学习&#xff1b;实时词典查询 - 双…...

设计模式-3 行为型模式

一、观察者模式 1、定义 定义对象之间的一对多的依赖关系&#xff0c;这样当一个对象改变状态时&#xff0c;它的所有依赖项都会自动得到通知和更新。 描述复杂的流程控制 描述多个类或者对象之间怎样互相协作共同完成单个对象都无法单独度完成的任务 它涉及算法与对象间职责…...

2025年全国I卷数学压轴题解答

第19题第3问: b b b 使得存在 t t t, 对于任意的 x x x, 5 cos ⁡ x − cos ⁡ ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx−cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min ⁡ t max ⁡ x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…...