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

【数据机构】2. 线性表之“顺序表”

- 第 96 篇 -
Date: 2025 - 05 - 09
Author: 郑龙浩/仟墨
【数据结构 2】

文章目录

  • 数据结构 - 2 -
  • 线性表之“顺序表”
    • 1 基本概念
    • 2 顺序表(一般为数组)
      • ① 基本介绍
      • ② 分类 (静态与动态)
      • ③ 动态顺序表的实现
        • **test.c文件:**
        • **SeqList.h文件:**
        • **SeqList.c文件:**

数据结构 - 2 -

线性表之“顺序表”

1 基本概念

一种逻辑结构,表示元素之间具有一对一的线性关系(即除首尾元素外,每个元素有且只有一个前驱和一个后继)

  • 逻辑上是“一条线”的结构(如 a₁ → a₂ → a₃ → ... → aₙ
  • 不关心物理存储方式(可以是连续内存或离散内存)

线性表(linear list) 是 n 个具有相同特征的数据元素的有限序列。线性表是一种在实际中广泛使用的的数据结构,常见的有: 顺序表、链表、栈、列队、字符串

线性表在逻辑上是线性结构,也就是连续的一条直线,但是在物理结构上并不一定是连续的,线性表在物理存储时,通常以数组和链表结构的形式存储

  • 顺序表是在物理和逻辑上都是连续的
  • 链表在逻辑上是连续的,在物理是非连续的

什么叫做逻辑结构呢?什么叫做物理结构呢?

  • 物理结构 –> 内存中的存储结构

  • 链表结构 –> 是我们想象出来的存储结构,为了方便我们自己理解和使用

扩展概念

内存一般分为四个区域

  • 静态去(数据段)
  • 常量区(代码段)

2 顺序表(一般为数组)

① 基本介绍

线性表的一种物理实现方式,基于连续内存(通常是数组)存储元素

  • 从物理和逻辑上都是连续的
  • 支持随机访问(通过下标直接访问,时间复杂度 O(1)
  • 插入 / 删除需移动元素(时间复杂度 O(n)

② 分类 (静态与动态)

顺序表分为两种

  • 静态顺序表 –> 使用定长数组存储 (数组长度是固定的)

    0123456789
  • 动态顺序表 –> 使用动态开辟的数组存储 (长度可以改)

    比如使用malloc

    p1,p2,p3 的地址并不是连续的,通过链表的形式可以在上一个元素中存下一个元素的地址,后面同理,直到最后一个元素

③ 动态顺序表的实现

补充:

#pragma once 什么作用?是解决头文件被重复包含的问题。比如第一次遇到#include "math.h",后续再遇到相同的 #include "math.h" 的时候,直接跳过,避免重复内容

我用VS写的动态顺序表以及一些用于顺序表的函数,内容如下

test.c文件:
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"// 测试头尾插入删除
void Test_SeqList1() {SeqList s;SeqListInit(&s);printf("\n尾插6次,依次插入 1 ~ 6:\n");SeqListPushBack(&s, 1); SeqListPushBack(&s, 2); SeqListPushBack(&s, 3);SeqListPushBack(&s, 4);SeqListPushBack(&s, 5);SeqListPushBack(&s, 6);SeqListPrint(&s);printf("尾删1次:\n\n");SeqListPopBack(&s);SeqListPrint(&s);printf("\n头插6次,依次插入111,222,333,444,555,666:\n");SeqListPushFront(&s, 111);SeqListPushFront(&s, 222);SeqListPushFront(&s, 333);SeqListPushFront(&s, 444);SeqListPushFront(&s, 555);SeqListPushFront(&s, 666);SeqListPrint(&s);printf("\n头删2次:\n");SeqListPopFront(&s);SeqListPopFront(&s);SeqListPrint(&s);printf("\n查找顺序表中的数据(找到返回1,没有返回0):\n");printf("查找222:%d\n", SeqListFind(&s, 222));printf("查找123:%d\n", SeqListFind(&s, 123));printf("\n对数据进行排序\n");QuickSort(&s, 0, s.size);SeqListPrint(&s);
}
int main(void) {Test_SeqList1();return 0;
}
SeqList.h文件:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 顺序表 --> 静态存储
// 只是将数组简单的封装了一下,并不能按需索取
#define N 100
typedef int SLDataType; // 将int名字变为SLDataType, 有什么好处呢,如果以后想将下面的所有的int变为double 的话,不需要改下面的类型,直接在这将int变为double即可
// 顺序表,在有效数组中必须是连续的
typedef struct SeqList1 {SLDataType arr[100]; // 定长数组size_t size; // 有效数据的个数 --> 有效数据长度
}SeqList1;// 顺序表 --> 动态存储    用的比较多的还是动态数据表
typedef int SLDataType; // 将int名字变为SLDataType, 有什么好处呢,如果以后想将下面的所有的int变为double 的话,不需要改下面的类型,直接在这将int变为double即可
// 顺序表,在有效数组中必须是连续的
typedef struct SeqList {SLDataType* array; // 指向动态开辟的数组size_t size; // 有效数据个数 --> 有效数据长度size_t capacity; // 容量的大小 capacity 英文意思 “容量”
}SeqList;// 接口 ---> 增删查改
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl);
// 顺序表销毁
void SeqListDestory(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);
// 检查空间,如果满了,进行增容 --> 单独封装接口,避免头插,尾插,随机插入的重复代码
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删
void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 交换两个元素
void Swap(SLDataType* a, SLDataType* b);
// 顺序表排序
void QuickSort(SeqList* psl, size_t L, size_t R);
// 顺序表二分查找
int SeqListBinarySearch(SeqList* psl, SLDataType x);
SeqList.c文件:
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 顺序表 --> 静态存储
// 只是将数组简单的封装了一下,并不能按需索取
#define N 100
typedef int SLDataType; // 将int名字变为SLDataType, 有什么好处呢,如果以后想将下面的所有的int变为double 的话,不需要改下面的类型,直接在这将int变为double即可
// 顺序表,在有效数组中必须是连续的
typedef struct SeqList1 {SLDataType arr[100]; // 定长数组size_t size; // 有效数据的个数 --> 有效数据长度
}SeqList1;// 顺序表 --> 动态存储    用的比较多的还是动态数据表
typedef int SLDataType; // 将int名字变为SLDataType, 有什么好处呢,如果以后想将下面的所有的int变为double 的话,不需要改下面的类型,直接在这将int变为double即可
// 顺序表,在有效数组中必须是连续的
typedef struct SeqList {SLDataType* array; // 指向动态开辟的数组size_t size; // 有效数据个数 --> 有效数据长度size_t capacity; // 容量的大小 capacity 英文意思 “容量”
}SeqList;// 接口 ---> 增删查改
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl) {psl->array = NULL; // 初始化数组为空psl->size = 0; // 元素个数为 0psl->capacity = 0; // 容量为 0
}// 顺序表销毁
void SeqListDestory(SeqList* psl) {free(psl->array);psl->array = NULL; // 将指针指向 “空” --> 也就是重置为空指针psl->size = 0; // 有效数据个数重置为 0psl->capacity = 0; // 容量大小重置为 0
}// 顺序表打印
void SeqListPrint(SeqList* psl) {// assert(psl);for (int i = 0; i < psl->size; ++i) {printf("%d ", psl->array[i]);}printf("\n");
}// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl) {// 如果满了,需要“增容” --> 增容多少呢,一般来说,都增二倍   多了太多,少了太少if (psl->size >= psl->capacity) {// 一定要判断是否为0,若为0,则增容为4,否则 0*2*2*2...不管*多少个,都是0size_t new_capacity = psl->capacity == 0 ? 4 : psl->capacity * 2;  // 初始容量设为4,后续二倍// new_arr 定义该变量是为了保护原本数组,假设扩容失败,就不会对原数据进行任何修改SLDataType* new_arr = (SLDataType*)realloc(psl->array, sizeof(SLDataType) * new_capacity);// 判断增容是否失败 --> 若指向的是空指针,则增容失败if (new_arr == NULL) {printf("扩容失败\n");return ;}// 若成功扩容,则不会执行上面 if 的语句,而是下面psl->array = new_arr;psl->capacity = new_capacity;}
}// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x) {// assert(psl); // 若psl为空,则终止执行,否则,执行 --> 仅用于Debug模式,在 Release 模式下会被禁用CheckCapacity(psl); // 检查是否要进行扩容psl->array[psl->size] = x; // 插入 xpsl->size++; // 增加有效数据个数 ++
}// 顺序表尾删
void SeqListPopBack(SeqList* psl) {// assert(psl); // 若psl为空,则终止执行,否则,执行 --> 仅用于Debug模式,在 Release 模式下会被禁用//psl->array[psl->size - 1] = 0; // 最后一个数据重置为 0 --> 是否重置为0都可以,做这一步操作只是为了删除“脏数据”,一般来说不重置,因为重置的话效率降低,而不重置也不影响使用psl->size--; // 有效数据个数--
}
// 顺序表头插 --> 将数据往后挪动
void SeqListPushFront(SeqList* psl, SLDataType x) {// assert(psl);CheckCapacity(psl); // 检查是否要进行扩容int end = (int)psl->size - 1; // 1指向最后一个数据 (用int,如果用size_t的话是不会出现end < 0的情况的)// 从最后一个数据开始,往后挪一位,直到将第一个数据挪到第二个数据的为止while (end >= 0) {psl->array[end + 1] = psl->array[end]; // 将指向数据挪动到下一位--end; // 向前遍历,依次指向前一数据}psl->array[0] = x; // 表头部插入xpsl->size++; // 表有效数据++
}
// 顺序表头删
void SeqListPopFront(SeqList* psl) {//assert(psl);int start = 0;while (start < psl->size - 1) {psl->array[start] = psl->array[start + 1]; // 将当前数据存储到下一位start++; // 向后遍历,依次指向后一个数据}psl->size--;
}
// 顺序表查找  参数1是数组地址   参数2是查找的数据
int SeqListFind(SeqList* psl, SLDataType x) {// assert(psl);for (int i = 0; i < psl->size; i++) {if (psl->array[i] == x) return i;}return -1;
}
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x) {assert(psl && pos <= psl->size);  // 必须添加边界检查CheckCapacity(psl); // 检查是否要进行扩容int end = (int)psl->size - 1; // 存储当前需要移动的位置while (end >= 0 && end >= pos) {psl->array[end + 1] = psl->array[end];end--; // 指向前一个}psl->array[pos] = x;  // 插入 xpsl->size++; // 有效数据个数++
}
// 顺序表删除pos位置的值  
void SeqListErase(SeqList* psl, size_t pos) {assert(psl && pos <= psl->size);  // 必须添加边界检查int start = (int)pos;while (start < psl->size - 1) {psl->array[start] = psl->array[start + 1];start++;}psl->size--; // 有效数据个数--
}// 交换两个元素
void Swap(SLDataType* a, SLDataType* b) {SLDataType tmp = *a;*a = *b;*b = tmp;
}
// 顺序表排序
void QuickSort(SeqList* psl, size_t L, size_t R) {if (L >= R)return ;int left = (int)L, right = (int)R;int key = left;//定义基准点keywhile (left < right)//当left<right说明还没相遇,继续数组内元素的交换{while (left < right && psl->array[right] >= psl->array[key])//right找小{right--;}while (left < right && psl->array[left] <= psl->array[key])//left找大{left++;}Swap(psl->array + right, psl->array + left); // 交换 left 和 right 位置的元素}Swap(psl->array + key, psl->array + left); // 此时left与right已经指向了同一个位置,只需要将基准点k的元素与left(right)指向的元素进行互换即可// 此时left位置的元素就是原来key位置的元素,而left位置左边全部是小于psl->array[left]的元素,left右边全部是大于psl->array[left]的元素if (left > 0) QuickSort(psl, L, left - 1); // 对左半部分进行排序if (left < R) QuickSort(psl, left + 1, R);// 对右半部分进行排序
}
// 顺序表二分查找 未找到->返回-1
int SeqListBinarySearch(SeqList* psl, SLDataType x) {// assert(psl);if (psl->size == 0) return -1;int left = 0, right = (int)psl->size - 1, mid/*中间*/; // 确定最初查找范围while (left <= right) {mid = left + ((right - left) >> 1);if (x < psl->array[mid]) // 在mid的左边right = mid - 1;else if (x > psl->array[mid]) // 在mid的右边left = mid + 1;elsereturn mid; // 找到了}return -1; // 未找到
}

相关文章:

【数据机构】2. 线性表之“顺序表”

- 第 96 篇 - Date: 2025 - 05 - 09 Author: 郑龙浩/仟墨 【数据结构 2】 文章目录 数据结构 - 2 -线性表之“顺序表”1 基本概念2 顺序表(一般为数组)① 基本介绍② 分类 (静态与动态)③ 动态顺序表的实现**test.c文件:****SeqList.h文件:****SeqList.c文件:** 数据结构 - 2 …...

Django ORM: values() 和 annotate() 方法详解

1. values()方法 1.1 基本概念 values()方法用于返回一个包含字典的QuerySet&#xff0c;而不是模型实例。每个字典表示一个对象&#xff0c;键对应于模型字段名称。 1.2 基本用法 # 获取所有书籍的标题和出版日期 from myapp.models import Bookbooks Book.objects.value…...

数据结构篇-二叉树

抽象定义CFG文法具体表示基本操作性质 抽象定义 二叉树是一个抽象的数学概念。它的定义是递归的 一棵二叉树可以是一个外部节点&#xff0c;一棵二叉树可以是内部节点&#xff0c;连接到一对二叉树&#xff0c;分别是它的左子树&#xff0c;和右子树。 这个抽象定义描述了二…...

前端面试每日三题 - Day 29

这是我为准备前端/全栈开发工程师面试整理的第29天每日三题练习&#xff1a; ✅ 题目1&#xff1a;Web Components技术全景解析 核心三要素 Custom Elements&#xff08;自定义元素&#xff09; class MyButton extends HTMLElement {constructor() {super();this.attachShado…...

Java设计模式之抽象工厂模式:从入门到精通

一、抽象工厂模式概述 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 1.1 专业定义 抽象工厂模式定义了一个工厂接口,用于创建一系列相关或依赖的对象,客户端通过调用抽象工…...

Rust中记录日志:fast_log

在Rust程序中记录日志&#xff0c;可以使用fast_log。 根据fast_log 的介绍&#xff0c;这是一个性能非常高的日志实现&#xff0c;还支持文件追加模式、压缩、切分与回滚等操作。 而且&#xff0c;这个库记录日志是异步的&#xff0c;即不会因为日志而影响程序的运行。只有当…...

构筑芯片行业的“安全硅甲”

在半导体行业&#xff0c;数据就是生命线。一份芯片设计图纸的泄露&#xff0c;可能让企业数亿研发投入付诸东流&#xff1b;一段核心代码的外传&#xff0c;甚至可能影响国家产业安全。然而&#xff0c;现实情况却是——许多芯片企业的数据防护&#xff0c;仍处于“裸奔”状态…...

C++ Dll创建与调用 查看dll函数 MFC 单对话框应用程序(EXE 工程)改为 DLL 工程

C Dll创建 一、添加 DllMain&#xff08;必要&#xff09; #include <fstream>void Log(const char* msg) {std::ofstream f("C:\\temp\\dll_log.txt", std::ios::app);f << msg << std::endl; }BOOL APIENTRY DllMain(HMODULE hModule, DWORD u…...

使用智能表格做FMEDA

一、优点 使用智能表格替代excel做FMEDA具备以下优势&#xff1a; 减少维护成本&#xff08;数据库关联&#xff0c;修改方便&#xff09;便于持续优化&#xff08;失效率分布&#xff0c;失效率模型可重复使用&#xff09;多人同步编写&#xff08;同时操作&#xff0c;同步…...

电动汽车充换电设施可调能力聚合评估与预测 - 使用说明文档

电动汽车充换电设施可调能力聚合评估与预测 - 使用说明文档 概述 本脚本real_data_model.m基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远&#xff0c;胡泽春)实现了电动汽车充电设施的负荷预测和可调能力评估。使用混合模型&#xff08;LSTM神经网络线…...

Tomcat 日志体系深度解析:从访问日志配置到错误日志分析的全链路指南

一、Tomcat 核心日志文件架构与核心功能 1. 三大基础日志文件对比&#xff08;权威定义&#xff09; 日志文件数据来源核心功能典型场景catalina.out标准输出 / 错误重定向包含 Tomcat 引擎日志与应用控制台输出&#xff08;System.out/System.err&#xff09;排查 Tomcat 启…...

MSF 生成不同的木马 msfvenom 框架命令

目录 什么是 msfvenom&#xff1f; 一、针对 Windows 的木马生成命令 1. EXE 格式&#xff08;经典可执行文件&#xff09; 2. VBS 脚本&#xff08;Visual Basic Script&#xff09; 3. PowerShell 脚本 4. DLL 文件&#xff08;动态链接库&#xff09; 5. Python 脚本…...

Linux云计算训练营笔记day05(Rocky Linux中的命令:管道操作 |、wc、find、vim)

管道操作 | 作用: 将前面命令的输出&#xff0c;传递给后面命令&#xff0c;作为后面命令的参数 head -3 /etc/passwd | tail -1 取第三行 head -8 /etc/passwd | tail -3 | cat -n 取6 7 8行 ifconfig | head -2 | tail -1 只查看IP地址 ifconfig | grep 192 过滤192的ip…...

【相机标定】OpenCV 相机标定中的重投影误差与角点三维坐标计算详解

摘要&#xff1a; 本文将从以下几个方面展开&#xff0c;结合典型代码深入解析 OpenCV 中的相机标定过程&#xff0c;重点阐述重投影误差的计算方法与实际意义&#xff0c;并通过一个 calcBoardCornerPositions() 函数详细讲解棋盘格角点三维坐标的构建逻辑。 在计算机视觉领域…...

传统销售VS智能销售:AI如何重构商业变现逻辑

如今最会赚钱的企业早就不靠堆人力了&#xff0c;他们都在悄悄用AI做商业变现。当普通销售还在手动记录客户信息时&#xff0c;AI销售系统已经能实时追踪客户在商品页的停留时长&#xff0c;甚至精确到秒。 传统客服人员还在机械地复制粘贴标准话术&#xff0c;AI销售却已经能根…...

从设计到开发,原型标注图全流程标准化

一、原型标注图是什么&#xff1f; 原型标注图&#xff08;Annotated Prototype&#xff09;是设计原型&#xff08;Prototype&#xff09;的详细说明书&#xff0c;通过图文结合的方式&#xff0c;将设计稿中的视觉样式、交互逻辑、适配规则等技术细节转化为开发可理解的标准…...

Mac QT水平布局和垂直布局

首先上代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QPushButton> #include<QVBoxLayout>//垂直布局 #include<QHBoxLayout>//水平布局头文件 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), …...

部署Superset BI(四)连接sql server数据库

sqlserver没有出现在Superset的连接可选菜单上&#xff0c;这一点让我奇怪。既然没有那就按着HANA的配置方式&#xff0c;照猫画虎。更奇怪的是安装好还不能出现&#xff0c;难道superset和微软有仇&#xff1f; --修改配置文件 rootNocobase:/usr/superset/superset# cd docke…...

Python爬虫(22)Python爬虫进阶:Scrapy框架动态页面爬取与高效数据管道设计

目录 一、背景&#xff1a;Scrapy在现代爬虫中的核心价值二、Scrapy项目快速搭建1. 环境准备与项目初始化2. 项目结构解析 三、动态页面处理&#xff1a;集成Splash与中间件1. 配置Splash渲染服务&#xff08;Docker部署&#xff09;2. 修改settings.py启用中间件3. 在Spider中…...

全球实物文件粉碎服务市场洞察:合规驱动下的安全经济与绿色转型

一、引言&#xff1a;从纸质堆叠到数据安全的“最后一公里” 在数字化转型浪潮中&#xff0c;全球企业每年仍产生超过1.2万亿页纸质文件&#xff0c;其中包含大量机密数据、客户隐私及商业敏感信息。据QYResearch预测&#xff0c;2031年全球实物文件粉碎服务市场规模将达290.4…...

使用Python 打造多格式文件预览工具 — 图、PDF、Word、Excel 一站式查看

在日常办公或文件管理场景中&#xff0c;我们经常面临这样的问题&#xff1a;在一个文件夹中短时间内产生了大量不同类型的文件&#xff08;如图片、PDF、Word、Excel&#xff09;&#xff0c;我们需要快速浏览和筛选这些文件的内容&#xff0c;却不希望一个个打开它们。有没有…...

Microsoft 365 Copilot:为Teams在线会议带来多语言语音交流新体验

随着AI技术的飞速发展&#xff0c;Microsoft 365 Copilot将大型语言模型&#xff08;LLM&#xff09;与业务数据深度融合&#xff0c;为用户带来了前所未有的办公体验。在Teams在线会议中&#xff0c;Copilot不仅能够作为智能助手提升会议效率&#xff0c;还能通过实时辅助同声…...

c++:双向链表容器(std::list)

目录 &#x1f9f1; 一、什么是 std::list&#xff1f; ⚙️ 二、底层结构图解 &#x1f9ea; 三、list 的常见操作 &#x1f4e6; 四、完整示例代码 &#x1f4cc; 五、特点总结对比 &#x1f6e0; 六、特殊函数 &#x1f4da; 七、list 迭代器操作 ⚠️ 八、使用场景…...

jenkins 启动报错

java.lang.UnsatisfiedLinkError: /opt/application/jdk-17.0.11/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory。 解决方案&#xff1a; yum install freetype-devel 安装完成之后重启jenkins。...

输入顶点坐标输出立方体长宽高的神经网络

写一个神经网络&#xff0c;我输入立方体投影线段的三视图坐标&#xff0c;输出分类和长宽高 import torch from torch import nn import torch.nn.functional as F# 假设每个视图有8个顶点&#xff0c;每个顶点有2个坐标值&#xff0c;因此每种视图有16个输入特征 input_dim…...

Layui表格行点击事件监听

​ 在 Layui 中&#xff0c;如果想监听表格行的点击事件&#xff0c;可以通过以下步骤实现&#xff1a; 初始化表格&#xff1a;首先确保你已经使用 Layui 的 table.render 方法成功渲染了你的表格。绑定行点击事件&#xff1a;Layui 并没有直接提供针对表格行点击的事件监听器…...

2025数维杯数学建模竞赛B题完整参考论文(共38页)(含模型、代码、数据)

2025数维杯数学建模竞赛B题完整参考论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、定义与符号说明 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.2问题2…...

TCP套接字通信核心要点

TCP套接字通信核心要点 通信模型架构 客户端-服务端模型 CS架构&#xff1a;客户端发起请求&#xff0c;服务端响应和处理请求双向通道&#xff1a;建立连接后实现全双工通信 服务端搭建流程 核心步骤 创建套接字 int server socket(AF_INET, SOCK_STREAM, 0); 参数说明&am…...

Android屏蔽通话功能和短信功能

需求开发中&#xff0c;有个要求屏蔽电话功能和短信功能&#xff0c;禁止应用打电话或短信&#xff0c;禁止api开发出的应用打电话或短信。这个约束怎么做呢&#xff1f; framework/base/core/res/res/values/config.xml.....<!-- Flag indicating whether the current devi…...

STM32TIM定时中断(6)

一、TIM介绍 1、TIM简介 TIM&#xff08;Timer&#xff09;定时器 定时器的基本功能&#xff1a;定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。 即定时触发中断&#xff0c;同时也可以看出&#xff0c;定时器就是一个计数器&#xff0c;当…...

hz2新建Keyword页面

新建一个single-keywords.php即可&#xff0c;需要筛选项再建taxonomy-knowledge-category.php 参考&#xff1a;https://www.tkwlkj.com/customize-wordpress-category-pages.html WordPress中使用了ACF创建了自定义产品分类products&#xff0c;现在想实现自定义产品分类下的…...

STL?vector!!!

一、前言 之前我们借助手撕string加深了类和对象相关知识&#xff0c;今天我们将一起手撕一个vector&#xff0c;继续深化类和对象、动态内存管理、模板的相关知识 二、vector相关的前置知识 1、什么是vector&#xff1f; vector是一个STL库中提供的类模板&#xff0c;它是存储…...

Android SDK

Windows纯净卸载Android SDK 1.关闭所有安卓相关的程序 Android StudioEmulators 如模拟器Command prompts using SDK 如appium服务 2.移除SDK相关目录 # Delete your SDK directory F:\android_sdk\android-sdk-windows# Also check and remove if present: $env:LOCALAPP…...

老旧 LabVIEW 系统升级改造

在工业自动化领域&#xff0c;LabVIEW 凭借其直观的图形化编程方式和强大的数据处理能力&#xff0c;成为开发测试测量与控制系统的主流平台。然而&#xff0c;随着技术的快速迭代和业务需求的不断变化&#xff0c;许多早期开发的 LabVIEW 系统逐渐暴露出性能不足、功能缺失或兼…...

【IDEA_Maven】(进阶版)永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径

【IDEA_Maven】永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径 问题解决 问题 Maven使用在线导入&#xff0c;在网络不佳时&#xff0c;往往加载很慢。十分浪费时间&#xff0c;所以我们需要在maven官网找到合适版本的maven&#xff0c;将其压缩包下载下来…...

VSCode远程无法选择虚拟环境问题

1. 无法选择虚拟环境 1.先保证扩展安装正确&#xff0c; 安装python&#xff0c;pylance和intelliCode 2. 直接在设置&#xff08;ctrl shift p&#xff09;里面搜索&#xff0c;点击“Python:Select Interpreter”选项 3. 可能有人会出现第三步的问题&#xff0c;参考链接…...

七、Hadoop 历史追踪、数据安全阀与 MapReduce初体验

Hadoop 实战拾遗&#xff1a;作业历史追踪、数据安全阀与 MapReduce 巧算 π 一、追溯作业足迹&#xff1a;JobHistory Server 的配置与使用 Hadoop 集群高效运行的背后&#xff0c;离不开对已完成作业的细致分析。JobHistory Server (JHS) 就像是作业的“黑匣子”&#xff0…...

【MySQL】联合查询

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、什么是联合查询 1.概念 2.语法要求 3.示例 4.为什么要使用联合查询 内连接 1.概念 2.语法 3.步骤&#xff1a; 外连接 1.概念 2.分类&#xff1a; 左外连…...

Java 原生实现代码沙箱(OJ判题系统第1期)——设计思路、实现步骤、代码实现

设计思路&#xff1a; 1、保存代码文件 ✅ 目的&#xff1a; 将用户提交的源码以字符串形式写入磁盘&#xff0c;生成 .java 文件。 &#x1f4cc; 原因&#xff1a; Java 是静态语言&#xff0c;必须先编译成 .class 文件才能运行。 需要物理文件路径来调用 javac 或使用 Java…...

课程设计。。。。

人脸考勤系统 需求分析 需求 1.实现企业日常人脸打卡需求 2.管理员要可以管理相关数据 3.可以移植到相关嵌入式设备 …..需求主要是这些&#xff0c;还可以让ai拓展一点 实现 1.介于可移植性这个需求&#xff0c;选用Qt框架&#xff0c;Qt框架跨平台性特比好&#xff0…...

gitlab相关面试题及答案

一、GitLab 基础 1. 什么是 GitLab&#xff1f;它与 GitHub 有什么区别&#xff1f; 答案&#xff1a; GitLab 是一个开源的 DevOps 平台&#xff0c;提供代码托管、CI/CD、问题跟踪等功能。与 GitHub 的主要区别&#xff1a; 开源与商业&#xff1a;GitLab 社区版开源&#x…...

『不废话』之Python 3.14 Beta版新特性

Python 3.14 的第一个Beta版已发布&#xff0c;有几个新特性可以提高我们的编码效率。 未来注释 在上一篇《『不废话』之Python高级特性技巧-CSDN博客》中提到3.7中新增了 “未来注释”&#xff0c;可以使用“from __future__ import annotations”或双引号包括的方式解决当类…...

AWS之数据分析类产品

以下是 Amazon Athena、Amazon QuickSight、AWS Lake Formation、AWS Glue、Amazon OpenSearch Service&#xff08;原 Elasticsearch Service&#xff09;、Amazon Kinesis Data Analytics 和 Amazon Redshift 的核心区别及典型使用场景的对比分析&#xff1a; 1. Amazon Athe…...

RabbitMQ消息的重复消费问题如何解决?

在RabbitMQ中&#xff0c;消息重复消费是一个常见问题&#xff0c;它通常发生在消费者处理消息时出现网络波动、节点故障或消费者自身处理逻辑异常&#xff0c;ACK 失败等情况&#xff0c;都会导致RabbitMQ 不能够正确感知消息已被成功处理&#xff0c;从而重新投递消息。以下是…...

5月9号.

v-for: v-bind: v-if&v-show: v-model: v-on: Ajax: Axios: async&await: Vue生命周期: Maven: Maven坐标:...

如何减少极狐GitLab 容器镜像库存储?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 减少容器镜像库存储 (BASIC ALL) 未清理的容器镜像库会随着时间的推移而变大。添加大量镜像或标签时&#xff1a; 获取可用标…...

怎么用idea打jar包

背景 前端使用vue开发&#xff0c;打包生成dist文件&#xff0c;需要打包成jar包 步骤 前端的dict文件放到后端的src\main\resources目录下dict文件夹改名为staticidea打开后端代码&#xff0c;依次点击右侧maven下的clean 、package最后会在项目的target目录下生成jar&…...

03 mysql 连接

安装 MySQL 后,我们就需要连接它。 使用命令行方式连接使用图形化工具连接一、使用命令行客户端连接 在上一节内容02 mysql 管理(Windows版)-CSDN博客 我们采用的就是这个连接方法,这种方法直接连接的是root用户,找到该命令行属性,打开可以看到里面的参数是root: 这种…...

Jenkins集成Maven

一、概述 Jenkins是一个开源的持续集成工具&#xff0c;用于自动化各种开发任务。Maven是一个项目管理和构建自动化工具&#xff0c;主要用于Java项目。通过将Jenkins和Maven集成&#xff0c;可以实现自动化构建、测试和部署&#xff0c;提高开发效率和代码质量。 二、前提条…...

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen&#xff08;通义千问&#xff09;智能体框架是阿里云推出的新一代AI智能体开发平台&#xff0c;其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计&#xff0c;将L…...