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

【数据结构】线性表之《顺序表》超详细实现

顺序表

  • 一.数据结构
    • 1.逻辑结构
    • 2.物理结构
  • 二.顺序表的分类
    • 1.静态顺序表
    • 2.动态顺序表
  • 三.顺序表的实现
    • 1.创建顺序表
    • 2.初始化顺序表
    • 3.判断是否扩容
    • 4.打印顺序表
    • 5.插入操作
      • 1.头插
      • 2.尾插
      • 3.按照下标插入
    • 6.删除操作
      • 1.头删
      • 2.尾删
      • 3.按照下标删除
    • 7.查找数据
    • 8.修改数据
    • 9.清空顺序表
    • 10.销毁顺序表
  • 四.模块化源代码
    • 1.SeqList.h
    • 2.SeqList.c
    • 3.test.c
  • 五.顺序表必做OJ题

前言:相信大家在学完C语言后,对于指针结构体以及动态内存管理有了一定的见解,那么数据结构像是检验真理的唯一标椎,它考察了你掌握这三种语法的程度,如果掌握的不是很理想的友友们,建议看看鄙人主页总结的文章,好啦,数据结构之旅就正式开始啦。

一.数据结构

数据结构计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么方式构成,以及数据元素之间呈现的结构。

1.逻辑结构

逻辑结构:数据对象中数据元素之间的相互关系。
逻辑结构分为:集合结构,线性结构,树形结构和图形结构。

2.物理结构

物理结构:数据的逻辑结构在计算机中的存储形式。
物理结构分为:顺序存储结构和链式存储结构。

二.顺序表的分类

顺序表实际属于线性表这个大家族,那么什么是线性表呢?

  1. 线性表:是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
  2. 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,
  3. 线性表在物理上存储时,通常以数组链式结构的形式存储。

1.静态顺序表

#define MAXSIZE 100     //静态顺序表的容量
typedef int SLDataType; //增强程序的可维护性typedef struct SeqList
{SLDataType arr[MAXSIZE];//定长数组int size;               //有效的数据个数
}SeqList;

也许有人会问:这个静态顺序表说的这么神秘,本质上不就是一个数组吗?

答:没错,顺序表的低层就是数组,逻辑结构与物理结构都是连续的。不过顺序表对数组进行了封装,提供了大量常用的接口(所谓接口就是调用函数),方便完成数据进行增,删,查,改等一系列的操作。

静态顺序表的缺点:程序一但运行,数组的大小就确定了,不能被修改。数组大小给小了,空间就不够用;数组大小给大了,空间就白白的浪费掉了;

为了方便对静态顺序表进行扩容,于是,动态顺序表便应运而生。

2.动态顺序表

typedef int SLDataType;//增强程序的可维护性typedef struct SeqList
{SLDataType* arr; //动态的,可以扩容int size;        //有效的数据个数int capacity;    //容量
}SL;

动态顺序表:通过堆区的动态内存管理控制顺序表空间的大小,即容量。

以下介绍的是基于动态顺序表的实现。

三.顺序表的实现

1.创建顺序表

创建一个顺序表结构,包含指向这块空间的起始地址,顺序表中存储数据的个数以及顺序表的最大容量。

typedef int SLDataType;//增强程序的可维护性,改变数据类型,只需改变int即可typedef struct SeqList
{SLDataType* arr; //指向顺序表的起始位置,方便扩容int size;        //顺序表的有效的数据个数int capacity;    //顺序表的容量大小
}SL;//类型的重命名
//等价于typedef struct SeqList SL;

2.初始化顺序表

一般初始化我们都习惯赋值为0,指针赋值为NULL。

void SeqListInit(SL* ps)
{assert(ps);//断言操作,等价于assert(ps != NULL);ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}

3.判断是否扩容

当我们想要增加数据的时候,会遇到容量不够用的问题。所以在此之前,应该检查容量与有效数据之间的关系,判断是否要扩容,接着插入数据。

void SeqListCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity)//顺序表已满,进行扩容操作{//判断顺序表容量是否为0,若为0,开辟储存4个数据大小的空间,若不为0,则容量翻倍int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//开辟空间SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL)//开辟失败{perror("realloc fail!");exit(1);//强行退出程序(表示遇到异常情况)}ps->arr = tmp;//开辟成功,修改指针ps->capacity = newcapacity;//修改容量}
}

注意:若传入realloc的指针为空指针(NULL),则realloc函数等价于malloc函数。

4.打印顺序表

循环遍历顺序表数据即可。

void SeqListPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

5.插入操作

1.头插

头插的思想:将数据整体向后挪动一位。注意:为了防止覆盖原先的数据,采用从后向前挪动。再进行头部插入,最后有效数据个数+1。

void SeqListPushFront(SL* ps, SLDataType x)
{assert(ps);SeqListCheckCapacity(ps);//检查容量int end = ps->size;while (end > 0){ps->arr[end] = ps->arr[end - 1];//将数据整体向后挪动一位。end--;}ps->arr[0] = x;//头插ps->size++;//有效数据个数+1//等价于在下标为0处插入:SeqListInsert(ps, 0, x);
}

2.尾插

尾插的思想:直接在尾部插入,有效数据个数+1即可。

void SeqListPushBack(SL* ps, SLDataType x)
{assert(ps);SeqListCheckCapacity(ps);//检查容量ps->arr[ps->size++] = x;//尾插:采用后置++//等价于在下标为ps->size处插入:SeqListInsert(ps, ps->size, x);
}

3.按照下标插入

按照下标插入的思想:与头插的思想相同,只不过是要挪动数据的起始位置不同而已。

void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//判断下标的合法性SeqListCheckCapacity(ps);int end = ps->size;while (end > pos){ps->arr[end] = ps->arr[end - 1];end--;}ps->arr[pos] = x;ps->size++;
}

6.删除操作

1.头删

头删的思想:不是真正意义上的删除数据,而是将头部之后的数据整体向前挪动一位,覆盖头部数据,达到与头删相同的效果,最后有效数据个数-1。注意:为了防止覆盖原先的数据,采用从前向后挪动,这里与头插不同。

void SeqListPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);//前提:顺序表存在数据int start = 0;while (start < ps->size - 1){ps->arr[start] = ps->arr[start + 1];start++;}ps->size--;//有效数据个数-1//等价于在下标为0处删除:SeqListErase(ps, 0);
}

2.尾删

尾删的思想:有效数据个数-1即可。

void SeqListPopBack(SL* ps)
{assert(ps);assert(ps->size > 0);//前提:顺序表存在数据ps->size--;//有效数据个数-1//等价于在下标为ps->size - 1处删除:SeqListErase(ps, ps->size - 1);
}

3.按照下标删除

按照下标删除的思想:与头删的思想相同,只不过是要挪动数据的起始位置不同而已。

void SeqListErase(SL* ps, int pos)
{assert(ps);assert(ps->size > 0);//前提:顺序表存在数据assert(pos >= 0 && pos < ps->size);//判断下标的合法性int start = pos;while (start < ps->size - 1){ps->arr[start] = ps->arr[start + 1];start++;}ps->size--;
}

7.查找数据

查找的思想:遍历数据,找到了返回下标,未找到返回-1即可。

int SeqListFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;//找到该数据,返回下标}}return -1;//未找到,返回-1
}

8.修改数据

修改的思想:利用下标确定位置,直接修改就行。较为简单。

void SeqListModify(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->arr[pos] = x;
}

9.清空顺序表

清空的思想:将有效数据个数与容量赋值为0。

void SeqListClear(SL* ps)
{assert(ps);ps->size = 0;ps->capacity = 0;
}

10.销毁顺序表

销毁的思想:由于空间是利用动态内存函数 realloc 在堆区开辟的,所以要及时释放,避免内存泄漏。

void SeqListDestory(SL* ps)
{assert(ps);if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;//置为NULL,防止野指针SeqListClear(ps);//清空顺序表
}

四.模块化源代码

1.SeqList.h

//#pragma once:防止头文件被重复包含
#ifndef __SEQLIST_H__
#define __SEQLIST_H__#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>typedef int SLDataType;//增强程序的可维护性typedef struct SeqList
{SLDataType* arr; //动态的,可以扩容int size;        //有效的数据个数int capacity;    //容量
}SL;void SeqListInit(SL* ps);//顺序表初始化void SeqListCheckCapacity(SL* ps);//检查顺序表的容量void SeqListPrint(SL* ps);//打印顺序表void SeqListPushBack(SL* ps, SLDataType x);//顺序表尾部插入void SeqListPushFront(SL* ps, SLDataType x);//顺序表头部插入void SeqListPopBack(SL* ps);//顺序表尾部删除void SeqListPopFront(SL* ps);//顺序表头部删除void SeqListInsert(SL* ps, int pos, SLDataType x);//顺序表按照位置(下标)插入void SeqListErase(SL* ps, int pos);//顺序表按照位置(下标)删除int SeqListFind(SL* ps, SLDataType x);//顺序表查找元素值,返回下标void SeqListModify(SL* ps, int pos, SLDataType x);//顺序表按位置(下标)修改void SeqListClear(SL* ps);//清空顺序表void SeqListDestory(SL* ps);//销毁顺序表#endif

2.SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1#include"SeqList.h"void SeqListInit(SL* ps)
{assert(ps);//等价于assert(ps != NULL);ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}void SeqListCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));//扩容if (tmp == NULL){perror("realloc fail!");exit(1);//强行退出程序(表示遇到异常情况)}ps->arr = tmp;ps->capacity = newcapacity;}
}void SeqListPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}void SeqListPushBack(SL* ps, SLDataType x)
{assert(ps);SeqListCheckCapacity(ps);ps->arr[ps->size++] = x;//SeqListInsert(ps, ps->size, x);
}void SeqListPushFront(SL* ps, SLDataType x)
{assert(ps);SeqListCheckCapacity(ps);int end = ps->size;while (end > 0){ps->arr[end] = ps->arr[end - 1];end--;}ps->arr[0] = x;ps->size++;//SeqListInsert(ps, 0, x);
}void SeqListPopBack(SL* ps)
{assert(ps);assert(ps->size > 0);ps->size--;//SeqListErase(ps, ps->size - 1);
}void SeqListPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);int start = 0;while (start < ps->size - 1){ps->arr[start] = ps->arr[start + 1];start++;}ps->size--;//SeqListErase(ps, 0);
}void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SeqListCheckCapacity(ps);int end = ps->size;while (end > pos){ps->arr[end] = ps->arr[end - 1];end--;}ps->arr[pos] = x;ps->size++;
}void SeqListErase(SL* ps, int pos)
{assert(ps);assert(ps->size > 0);assert(pos >= 0 && pos < ps->size);int start = pos;while (start < ps->size - 1){ps->arr[start] = ps->arr[start + 1];start++;}ps->size--;
}int SeqListFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;}}return -1;
}void SeqListModify(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->arr[pos] = x;
}void SeqListClear(SL* ps)
{assert(ps);ps->size = 0;ps->capacity = 0;
}void SeqListDestory(SL* ps)
{assert(ps);if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;SeqListClear(ps);
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"SeqList.h"enum//匿名枚举
{EXIT,PUSHBACK,PUSHFRONT,POPBACK,POPFRONT,INSERT,ERASE,FIND,MODIFY,PRINT,CLEAR
};void Menu()
{printf("*************顺序表************\n");printf("****1.尾插           2.头插****\n");printf("****3.尾删           4.头删****\n");printf("****5.插入           6.删除****\n");printf("****7.查找           8.修改****\n");printf("****9.打印          10.清空****\n");printf("****0.退出               ******\n");printf("*******************************\n");
}int main()
{SL sl;SeqListInit(&sl);int select = 0;   //菜单选项SLDataType value; //插入的值int pos = 0;      //插入或删除的下标do{Menu();printf("请选择您的操作:");scanf("%d", &select);switch (select){case EXIT:printf("退出顺序表!");break;case PUSHBACK:printf("请输入您要尾插的值(输入-1代表结束):");while ((scanf("%d", &value), value != -1)) //逗号表达式{SeqListPushBack(&sl, value);}break;case PUSHFRONT:printf("请输入您要头插的值(输入-1代表结束):");do{scanf("%d", &value);if (value != -1){SeqListPushFront(&sl, value);}} while (value != -1);break;case POPBACK:SeqListPopBack(&sl);break;case POPFRONT:SeqListPopFront(&sl);break;case INSERT:printf("请输入要插入的《下标》与《值》:");scanf("%d %d", &pos, &value);SeqListInsert(&sl, pos, value);break;case ERASE:printf("请输入要删除的《下标》:");scanf("%d", &pos);SeqListErase(&sl, pos);break;case FIND:printf("请输入要查找的《值》:");scanf("%d", &value);int ret = SeqListFind(&sl, value);if (ret != -1){printf("找到了下标为:%d\n", ret);}else{printf("找不到!");}break;case MODIFY:printf("请输入要修改的《下标》以及修改后的《值》:");scanf("%d %d", &pos, &value);SeqListModify(&sl, pos, value);break;case PRINT:SeqListPrint(&sl);break;case CLEAR:SeqListClear(&sl);break;default:printf("您输入的值错误,请重新选择!\n");break;}} while (select);SeqListDestory(&sl);return 0;
}

五.顺序表必做OJ题

  1. 原地移除元素
  2. 合并两个有序数组

创作不易,如果能帮到你的话能赏个三连吗?感谢啦!!!

相关文章:

【数据结构】线性表之《顺序表》超详细实现

顺序表 一.数据结构1.逻辑结构2.物理结构 二.顺序表的分类1.静态顺序表2.动态顺序表 三.顺序表的实现1.创建顺序表2.初始化顺序表3.判断是否扩容4.打印顺序表5.插入操作1.头插2.尾插3.按照下标插入 6.删除操作1.头删2.尾删3.按照下标删除 7.查找数据8.修改数据9.清空顺序表10.销…...

开源模型应用落地-音乐生成模型-suno/bark深度使用-AIGC应用探索(六)

一、前言 学习音乐生成模型具有极其重要的价值。通过对音乐生成模型的深入学习,我们能够探索到音乐创作的全新边界和可能性。它不仅可以开启一扇通往无限音乐创意的大门,让我们领略到科技与艺术完美融合所带来的震撼与惊喜,还能帮助我们在音乐领域实现前所未有的突破和创新。…...

为何选择Xinstall?告别邀请码,让App推广更便捷!

在互联网日益繁荣的今天&#xff0c;App的推广和运营成为了各大企业关注的重点。然而&#xff0c;传统的推广方式如邀请码限制&#xff0c;往往会给用户带来不便&#xff0c;同时也限制了App的快速增长。在这个背景下&#xff0c;Xinstall凭借其独特的功能和服务&#xff0c;成…...

JavaScript基础入门

目录 任务描述 相关知识 JavaScript语言简介 JavaScript注释 搭建JavaScript的运行环境 JavaScript输出 弹出对话框模式 控制台模式 页面输出模式 编程要求 任务描述 要了解一门编程语言&#xff0c;要从输出开始。 本关任务&#xff1a;采用相关知识中介绍的任意一…...

windows11子系统Ubuntu 22.04.4子安装图形化界面

1、windows11家庭版本设置 打开虚拟机安装许可 2、Microsoft Store下载安装ubuntu 我使用的是22.04.4 LTS版本 3、 打开ubuntu 命令窗口 1、打开win11的命令行&#xff0c;在下拉三角下标&#xff0c;打开&#xff0c;可以看到有Ubuntu 的选项&#xff0c;点击即可进入linux命…...

对 2024 年美赛选题的建议

对2024年美赛选题的建议包括&#xff1a; 1. 深入探讨当下全球面临的重大问题和挑战&#xff1a;鉴于美赛通常聚焦于全球性议题&#xff0c;如气候变化、可持续发展、数据分析等&#xff0c;参赛学生应关注这些议题&#xff0c;并深入研究相关数据与背景信息&#xff0c;以提出…...

PyTorch tutorials:快速学会使用PyTorch

准备深入学习transformer&#xff0c;并参考一些资料和论文实现一个大语言模型&#xff0c;顺便做一个教程&#xff0c;今天是番外篇&#xff0c;介绍下PyTorch&#xff0c;后面章节实现代码主要使用这个框架。 本系列禁止转载&#xff0c;主要是为了有不同见解的同学可以方便联…...

【CT】LeetCode手撕—手撕快排

目录 题目1-思路-快排1-1 快排的核心思想快速排序算法步骤优美的调整区间 1-2 ⭐快排的实现 2- 实现⭐912. 排序数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;912. 排序数组 1-思路-快排 1-1 快排的核心思想 选择一个基准 基准左侧的元素都小于该元素基准右侧的元…...

使用ARK工具ATool清除典型蠕虫MyDoom

1 概述 在长期的日常安全事件监测过程中&#xff0c;安天CERT经常捕获到大量的MyDoom蠕虫样本和传播该蠕虫的钓鱼邮件。受害主机感染MyDoom后会被放置后门&#xff0c;以便攻击者下发后续恶意软件&#xff0c;进行攻击或窃密等操作。MyDoom蠕虫最早发现于2004年&…...

在hue中使用ooize调度ssh任务无法执行成功,无法查看错误

ssh执行失败&#xff0c;但是hue没有给出明确的错误原因&#xff1a; 经过经验分析&#xff0c;原来是服务器上的sh文件用的是doc/window格式&#xff0c;需要使用notepad将格式改为unix之后就可以正常执行。 特此记录&#xff0c;避免遗忘知识点...

一套轻量、安全的问卷系统基座,提供面向个人和企业的一站式产品级解决方案

大家好&#xff0c;今天给大家分享的是一款轻量、安全的问卷系统基座。 XIAOJUSURVEY是一套轻量、安全的问卷系统基座&#xff0c;提供面向个人和企业的一站式产品级解决方案&#xff0c;快速满足各类线上调研场景。 内部系统已沉淀 40种题型&#xff0c;累积精选模板 100&a…...

3秒生成!这个AI模型画风也太治愈了,新手也能轻松驾驭

还在为不会画画而苦恼吗&#xff1f;别担心&#xff0c;今天给大家介绍一个超好用的AI模型——Soft and Squishy Linework&#xff0c;即使是小白也能轻松生成可爱的动漫图像&#xff01; Soft and Squishy Linework&#xff1a;专门生成柔和的、低保真&#xff08;lofi&#…...

数字人全拆解:如何构建一个基于大模型的实时对话3D数字人?

简单地说&#xff0c;数字人就是在数字世界的“人”。当前语境下我们谈到的数字人通常指的是借助AI技术驱动的虚拟世界人物&#xff0c;具备与真实人类相似甚至接近的外形、感知、交互与行为能力。 AI技术在智能数字人的应用中举足轻重&#xff0c;特别是随着大模型能力的涌现…...

实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

2024北京智源大会

北京智源大会是年度国际性人工智能高端学术交流的盛会&#xff0c;定位于内行的AI盛会。智源大会紧密围绕当前人工智能学术领域迫切需要解决的问题&#xff0c;以及产业落地过程中存在的诸多挑战&#xff0c;开展深入探讨。智源研究院是2018年11月份成立的一家人工智能领域的新…...

youlai-boot项目的学习—本地数据库安装与配置

数据库脚本 在项目代码的路径下&#xff0c;有两个版本的mysql数据库脚本&#xff0c;使用对应的脚本就安装对应的数据库版本&#xff0c;本文件选择了5 数据库安装 这里在iterm2下使用homebrew安装mysql5 brew install mysql5.7注&#xff1a;记得配置端终下的科学上网&a…...

Android平台如何实现多路低延迟RTSP|RTMP播放?

技术背景 实际上&#xff0c;我们在2015年做Android平台RTSP、RTMP播放模块的时候&#xff0c;第一版就支持了多实例播放&#xff0c;因为SDK设计比较灵活&#xff0c;做个简单的player实例封装即可实现多实例播放&#xff08;Android Unity的就有多路demo&#xff09;&#x…...

深入探索Java开发世界:Java基础~类型分析大揭秘

文章目录 一、基本数据类型二、封装类型三、类型转换四、集合类型五、并发类型 Java基础知识&#xff0c;类型知识点梳理~ 一、基本数据类型 Java的基本数据类型是语言的基础&#xff0c;它们直接存储在栈内存中&#xff0c;具有固定的大小和不变的行为。 八种基本数据类型的具…...

短URL服务设计

引言 在营销系统里&#xff0c;为了增加系统的活跃用户数&#xff0c;经常会有各种各样的营销活动。这类活动几乎都是为了充分利用存量用户的价值&#xff0c;促使他们分享产品或App以达到触达到更多用户的目的。又或者是出于营销目的&#xff0c;群发优惠券触达短信这种场景。…...

Kafka集成flume

1.flume作为生产者集成Kafka kafka作为flume的sink&#xff0c;扮演消费者角色 1.1 flume配置文件 vim $kafka/jobs/flume-kafka.conf # agent a1.sources r1 a1.sinks k1 a1.channels c1 c2# Describe/configure the source a1.sources.r1.type TAILDIR #记录最后监控文件…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

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.…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...