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

【数据结构】顺序表(SeqList)(增、删、查、改)详解

一、顺序表的概念和结构

1、顺序表的概念:

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。在数组上完成数据的增删查改


 2、顺序表的结构:

(1)静态顺序表:使用定长数组存储元素

缺点:只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致 N 定大了,空间开多了浪费,开少了不够用。

// 顺序表的静态存储
#define N 10
typedef int SLDataType;typedef struct SeqList
{SLDataType array[N];// 定长数组size_t size;// 有效数据个数
}SeqList;

 (2)动态顺序表:使用动态开辟的数组存储元素

优点:动态顺序表可以根据需要动态的分配空间大小。

// 顺序表的动态存储
typedef int SLDataType; //类型重命名,后续要存储其它类型时方便更改typedef struct SeqList
{SLDataType* a;// 指向动态开辟的数组size_t size;// 有效数据个数(当前顺序表中已存放的数据个数)size_t capacity;// 容量大小(顺序表总共能够存放的数据个数)
}SeqList;

:size_t 数据类型表示 C 中任何对象所能达到的最大长度,它是无符号整数。 


 二、动态顺序表的接口实现

1、创建文件

  1. test.c(主函数、测试顺序表各个接口功能)
  2. SeqList.c(动态顺序表接口函数的实现)
  3. SeqList.h(动态顺序表的类型定义、接口函数声明、引用的头文件)

  


 2、SeqList.h 头文件代码

// SeqList.h
#pragma once // 防止头文件被二次引用#include<stdio.h>
#include<assert.h> // assert
#include<stdlib.h> // realloctypedef int SLDataType; // 后续要存储其它类型时方便直接更改// 顺序表的动态存储
typedef struct SeqList
{SLDataType* a; // 指向动态开辟的数组size_t size ; // 有效数据个数size_t capicity ; // 容量空间的大小
}SeqList;// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl);
// 顺序表销毁
void SeqListDestory(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);
// 顺序表打印
void SeqListPrint(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);
// 查看顺序表中的有效数据个数 
size_t SeqListSize(const SeqList* psl);
// 修改指定下标位置的数据
void SeqListAt(SeqList* psl, size_t pos, SLDataType x);

 三、在 SeqList.c 中实现各个接口函数

1、初始化顺序表

// 初始化顺序表
void SeqListInit(SeqList* psl)
{assert(psl); // 断言 -- 防止传进来的指针为空psl->a = NULL; // 初始化顺序表为空psl->size = 0; // 初始数据个数为0psl->capacity = 0; // 初始空间容量为0
}

2、顺序表销毁

// 销毁顺序表
void SeqListDestroy(SeqList* psl)
{assert(psl); // 断言 -- 防止传进来的指针为空free(psl->a); // 释放动态开辟的空间psl->a = NULL; // 置空psl->size = 0; // 数据个数置为0psl->capacity = 0; // 空间容量大小置为0
}

3、检查空间,如果满了,进行增容 

// 检查顺序表容量是否满了,好进行增容
void CheckCapity(SeqList* psl)
{if (psl->size == psl->capacity) // 检查容量,满了则增容{// 原来容量为0,扩容为4;不为0,扩容为原来的2倍size_t newcapacity = psl->capacity == 0 ? 4 : 2 * (psl->capacity);psl->a = (SeqList*)realloc(psl->a, sizeof(SLDateType) * newcapacity); // 扩容psl->capacity = newcapacity; // 更新容量}
}
为什么不采取插一个数据,增容一个空间的方式呢?

因为这样做很麻烦,代价也很大。一般情况下,为了避免频繁的增容,当空间满了之后,我们不会选择一个一个的去增,而是一次增容 2 倍,当然也不会一次增容太大,比如 3 倍 4 倍,这样空间可能会造成浪费,所以 2 倍是一个折中的选择。


 realloc 在开辟动态内存空间时,如果传给它的是一个空指针,那么他就会开辟一个新的内存空间,用法类似malloc


4、顺序表尾插

// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDateType x) // O(1)
{// 不需要断言 空指针也符合条件// 第一种写法:/* CheckCapacity(psl); // 检查顺序表容量是否已满psl->a[psl->size] = x; // 尾插数据psl->size++; // 有效数据个数+1 */// 第二种写法:SeqListInsert(psl, psl->size, x);
}


5、顺序表尾删

// 顺序表尾删
void SeqListPopBack(SeqList* psl) // O(1)
{assert(psl); // 断言// 第一种写法:/* assert(psl->size > 0); // 尾删 -- 顺序表不能为空//psl->a[psl->size - 1] = 0; // 不知道SLDataType是什么类型的数据,不能冒然的直接赋值为0psl->size--; // 有效数据个数-1 */// 第二种写法:SeqListErase(psl, psl->size - 1);
}
关于在程序中检查错误的方式:

(1)温柔检查法: 如果出现错误,程序就不再继续执行。因为一般情况下,程序运行成功就返回0,则运行失败就返回-1。
(2)暴力检查法(推荐):如果发生错误,程序会报警告,可以直接知道出错位置。

// 温柔处理方式if (psl->size > 0){psl->a[ps->size - 1] = 0;psl->size--;}// 暴力处理方式assert(psl->size > 0);psl->size--;

:不知道 SLDataType 是什么类型的数据,不能冒然的将顺序表最后一个数据赋值为 0,我们只需将有效数据个数 size 减 1 即可达到尾删的目的。 


6、顺序表头插

// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDateType x) // O(n)
{// 头插不需要断言 空指针也符合条件/* CheckCapacity(psl); // 检查顺序表容量是否已满for (int i = psl->size - 1; i >= 0; i--) // 顺序表中[0,size-1]的元素依次向后挪动一位{psl->a[i + 1] = psl->a[i];}psl->a[0] = x; // 头插数据psl->size++; // 有效数据个数+1 */SeqListInsert(psl, 0, x);
}


7、顺序表头删

// 顺序表头删
void SeqListPopFront(SeqList* psl) // O(n)
{assert(psl); // 断言// 方法一:/* assert(psl->size > 0);  //顺序表不能为空for (int i = 1; i < psl->size; i++) // 顺序表中[1,size-1]的元素依次向前挪动一位{psl->a[i - 1] = psl->a[i];}psl->size--; // 有效数据个数-1 */// 方法二:SeqListErase(psl, 0);
}


8、顺序表打印

// 打印顺序表
void SeqListPrint(SeqList* ps)
{assert(ps); // 断言if (psl->size == 0) // 顺序表为空{printf("顺序表为空\n");return;}// 顺序表不为空for (size_t i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}

 9、顺序表查找指定值

// 顺序表查找
int SeqListFind(SeqList* psl, SLDateType x)
{assert(psl); // 断言for (int i = 0; i < psl->size; i++){if (psl->a[i] == x){return i; //查找到,返回该值在数组中的下标}}return -1; // 没查找到
}


 10、顺序表在pos位置插入x

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDateType x)
{assert(psl); // 断言assert(pos >= 0 && pos <= (psl->size)); // 检查pos下标的合法性CheckCapity(psl);// 第一种写法:/* size_t end = psl->size;while (end > pos){psl->a[end] = psl->a[end - 1];end--;} *///第二种写法:size_t i = 0;for (i = psl->size; i > pos; i--)  // 将pos位置后面的数据依次向后挪动一位{psl->a[i] = psl->a[i - 1];}psl->a[pos] = x; // 插入数据psl->size++; // 有效数据个数+1
}

:原先下面这种写法,当顺序表为空 size = 0 时,会导致 i = -1,执行 i >= pos 时,i 被算术转换成无符号数,而无符号数的 -1 是一个值很大的正数远远大于 pos,满足条件进入循环,会造成越界访问。 

int i = 0;
for (i = psl->size - 1; i >= pos; i--)psl->a[i + 1] = psl->a[i];

:转换并不会改变 i 本身的值,而是在执行 i >= pos 时,生成一个临时值与 pos 进行比较。如果在顺序表头部(pos = 0)插入数据,i 最终也会减成 -1,被算术转换后变成一个很大的数。


总结避免负数给到无符号数,或者避免有符号数变成负数后,被算术转换或整型提升后,变成一个很大的数。按照第二种写法就可以避免 i 变成负数(-1)了。


 实现了此接口,顺序表头插尾插相当于在下标为 0psl -> size-1 位置处插入数据。



11、顺序表删除pos位置的值

// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos)
{assert(psl); // 断言assert(psl->size > 0); // 顺序表不能为空assert(pos >= 0 && pos < psl->size); // 检查pos下标的合法性// 第一种写法:/* size_t start = pos;while (start < psl->size-1){psl->a[start] = psl->a[start + 1];start++;} *///第二种写法:size_t i = 0;for (i = pos + 1; i < psl->size; i++)  // 将pos位置后面的数据依次向前挪动一位{psl->a[i - 1] = psl->a[i];}psl->size--; // 有效数据个数-1
}

实现了此接口,顺序表头删尾删相当于删除下标为 0 psl -> size-1 位置处的数据。



12、查看顺序表中的有效数据个数 

// 查看顺序表中的有效数据个数
size_t SeqListSize(const SeqList* psl)
{assert(psl); // 断言return psl->size;
}
为什么不选择在主函数里面直接通过定义的结构体变量直接访问,还要弄一个相关函数呢?

在数据结构中,如果要访问或者修改数据结构中的数据不要直接访问,而是应该去调用它的函数来访问和修改,这样会更加规范和安全,也更方便检查出是否出现了越界等错误情况


数组越界是不一定报错的,系统对越界的检查是设岗检查。

  • 越界读(读了不属于自己的数据),一般是检查不出来的,往往并不会造成内存奔溃。

  • 越界写(缓冲区溢出)如果是修改到标志位才会被检查出来,会造成数据破坏,严重会造成内存奔溃。

(系统在数组末尾后设的有标志位,越界写时,恰好修改到标志位了,就会被检查出来)


13、修改指定下标位置的数据

// 修改指定下标位置的数据
void SeqListAt(SeqList* psl, size_t pos, SLDataType x)
{assert(psl); // 断言assert(psl->size > 0); // 顺序表不能为空assert(pos >= 0 && pos < psl->size); // 检查pos下标的合法性psl->a[pos] = x; // 修改pos下标处对应的数据
}

 四、代码整合

// SeqList.c
#include "SeqList.h"

// 初始化顺序表
void SeqListInit(SeqList* psl)
{assert(psl); // 断言 -- 防止传进来的指针为空psl->a = NULL; // 初始化顺序表为空psl->size = 0; // 初始数据个数为0psl->capacity = 0; // 初始空间容量为0
}// 销毁顺序表
void SeqListDestroy(SeqList* psl)
{assert(psl); // 断言 -- 防止传进来的指针为空free(psl->a); // 释放动态开辟的空间psl->a = NULL; // 置空psl->size = 0; // 数据个数置为0psl->capacity = 0; // 空间容量大小置为0
}// 检查顺序表容量是否满了,好进行增容
void CheckCapity(SeqList* psl)
{if (psl->size == psl->capacity) // 检查容量,满了则增容{// 原来容量为0,扩容为4;不为0,扩容为原来的2倍size_t newcapacity = psl->capacity == 0 ? 4 : 2 * (psl->capacity);psl->a = (SeqList*)realloc(psl->a, sizeof(SLDateType) * newcapacity); // 扩容psl->capacity = newcapacity; // 更新容量}
}// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDateType x) // O(1)
{SeqListInsert(psl, psl->size, x);
}// 顺序表尾删
void SeqListPopBack(SeqList* psl) // O(1)
{assert(psl); // 断言SeqListErase(psl, psl->size - 1);
}// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDateType x) // O(n)
{SeqListInsert(psl, 0, x);
}// 顺序表头删
void SeqListPopFront(SeqList* psl) // O(n)
{assert(psl); // 断言SeqListErase(psl, 0);
}// 打印顺序表
void SeqListPrint(SeqList* ps)
{assert(ps); // 断言if (psl->size == 0) // 顺序表为空{printf("顺序表为空\n");return;}// 顺序表不为空for (size_t i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}// 顺序表查找
int SeqListFind(SeqList* psl, SLDateType x)
{assert(psl); // 断言for (int i = 0; i < psl->size; i++){if (psl->a[i] == x){return i; //查找到,返回该值在数组中的下标}}return -1; // 没查找到
}// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDateType x)
{assert(psl); // 断言assert(pos >= 0 && pos <= (psl->size)); // 检查pos下标的合法性CheckCapity(psl);size_t i = 0;for (i = psl->size; i > pos; i--)  // 将pos位置后面的数据依次向后挪动一位{psl->a[i] = psl->a[i - 1];}psl->a[pos] = x; // 插入数据psl->size++; // 有效数据个数+1
}// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos)
{assert(psl); // 断言assert(psl->size > 0); // 顺序表不能为空assert(pos >= 0 && pos < psl->size); // 检查pos下标的合法性size_t i = 0;for (i = pos + 1; i < psl->size; i++)  // 将pos位置后面的数据依次向前挪动一位{psl->a[i - 1] = psl->a[i];}psl->size--; // 有效数据个数-1
}// 查看顺序表中的有效数据个数
size_t SeqListSize(const SeqList* psl)
{assert(psl); // 断言return psl->size;
}// 修改指定下标位置的数据
void SeqListAt(SeqList* psl, size_t pos, SLDataType x)
{assert(psl); // 断言assert(psl->size > 0); // 顺序表不能为空assert(pos >= 0 && pos < psl->size); // 检查pos下标的合法性psl->a[pos] = x; // 修改pos下标处对应的数据
}

相关文章:

【数据结构】顺序表(SeqList)(增、删、查、改)详解

一、顺序表的概念和结构 1、顺序表的概念&#xff1a; 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 2、顺序表的结构&#xff1a; &#xff08;1&#xff09;静态顺序表&#xff1a;使…...

[golang gin框架] 42.Gin商城项目-微服务实战之后台Rbac微服务角色增删改查微服务

一.重构后台Rbac用户登录微服务功能 上一节讲解了后台Rbac微服务用户登录功能以及Gorm数据库配置单独抽离&#xff0c;Consul配置单独抽离&#xff0c;这一节讲解后台Rbac微服务角色增删改查微服务功能&#xff0c;Rbac微服务角色增删改查微服务和后台Rbac用户登录微服务是属于…...

项目篇:Echo论坛系统项目

一、登录注册模块 1、注册功能 1.1、注册流程图 1.2、注册代码 /*** 用户注册* param user* return Map<String, Object> 返回错误提示消息&#xff0c;如果返回的 map 为空&#xff0c;则说明注册成功*/public Map<String, Object> register(User user) {Map&l…...

数据可视化(2)

1.柱状图 #柱状图 #bar(x,height,width,*,aligncenter,**kwargs) #height柱子的高度&#xff0c;即y轴上的数据 #width数组的宽度&#xff0c;默认值0.8 #*表示后面的参数为匿名关键字&#xff0c;必须传入参数 #kwargs关键字参数x[1,2,3,4,5] height[random.randint(10,100)f…...

MD-MTSP:斑马优化算法ZOA求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、斑马优化算法ZOA 斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;ZOA&#xff09;Eva Trojovsk等人于2022年提出&#xff0c;其模拟斑马的觅食和对捕食者攻击的防御行为。斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;ZOA&#x…...

【笔试强训选择题】Day32.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、Da…...

抖音seo账号矩阵系统源码如何开发布局?

目录 一、 抖音SEO账号矩阵系统源码的开发布局步骤如下&#xff1a; 二。 开发部署源码 三、 开发部署功能设计 1. 短视频AI智能创作 2. 托管式账号管理: 3. 数据分析 4. 智能营销获客 四。 抖音seo源码开发部署交付技术文档包含 五。 开发代码展示&#xff1a; 一、 抖…...

vue项目cdn打包优化

0.用vue ui可以查看项目打包后的情况。 1.定义包的排除 let externals {axios: axios,element-ui: ELEMENT,echarts: echarts,} configureWebpack: {externals: externals }2.配置cdn包资源 // 配置 let cdn {css: [// element-ui csshttps://unpkg.com/element-ui/lib/th…...

Android 之 MediaPlayer 播放音频与视频

本节引言&#xff1a; 本节带来的是Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码 和播放音视频。它支持三种不同的…...

React中事件处理器的基本使用

在React中&#xff0c;为了提高性能&#xff0c;跨浏览器兼容性和开发体验&#xff0c;React实现了一套自己的事件机制&#xff0c;利用事件委托和合成事件的方式统一管理事件订阅和分发。 为了让组件能够响应用户的交互行为&#xff0c;React提供了一系列的事件处理器&#xf…...

RobotFramework

一、RobotFramework的简介和特点 1、关键字驱动&#xff1a; 把项目中的业务逻辑封装成一个一个的关键字&#xff0c;然后调用不同的关键字组成不同的业务 2、数据驱动 把测试数据放到excel&#xff1a;yaml文件中 通过改变文件中的数据去驱动测试用例执行 3、特点&#xff…...

【Matplotlib 绘制折线图】

使用 Matplotlib 绘制折线图 在数据可视化中&#xff0c;折线图是一种常见的图表类型&#xff0c;用于展示随着变量的变化&#xff0c;某个指标的趋势或关系。Python 的 Matplotlib 库为我们提供了方便易用的功能来绘制折线图。 绘制折线图 下面的代码展示了如何使用 Matplo…...

ARM汇编基本变量的定义和使用

一、ARM汇编中基本变量是什么? 数字变量: GBLA LCLA SETA 逻辑变量:GBLL LCLL SETL 字符串:GBLS LCLS SETLS 注意需要TAB键定义变量和行首改变值 二、使用步骤 1.引入库 代码如下(示例): GBLA led_num Reset_Handler PROCEXPORT Reset_Handler [WEA…...

排序算法汇总

每日一句&#xff1a;你的日积月累终会成为别人的望尘莫及 目录 常数时间的操作 选择排列 冒泡排列 【异或运算】 面试题&#xff1a; 1&#xff09;在一个整形数组中&#xff0c;已知只有一种数出现了奇数次&#xff0c;其他的所有数都出现了偶数次&#xff0c;怎么找到…...

cocos2d 中UserDefault在windows平台下的路径问题

在使用cocos2dx c开发项目时&#xff0c;通常使用cocos自带的UserDefault来存储一些项目所用到的一些配置信息&#xff1a;如游戏的音量&#xff0c;游戏的闯关数等... 但是windows平台下&#xff0c;测试发现如果用户的帐户名使用是中文&#xff0c;在启动程序时会报错&#…...

ChatGPT与高等教育变革:价值、影响及未来发展

最近一段时间&#xff0c;ChatGPT吸引了社会各界的目光&#xff0c;它可以撰写会议通知、新闻稿、新年贺信&#xff0c;还可以作诗、写文章&#xff0c;甚至可以撰写学术论文。比尔盖茨、马斯克等知名人物纷纷为此发声&#xff0c;谷歌、百度等知名企业纷纷宣布要提供类似产品。…...

Matlab Image Processing toolbox 下载安装方法

当安装好Matlab之后&#xff0c;发现没有Image Processing toolbox这个图像处理工具箱 从新安装一遍&#xff0c; 选上 Image Processing toolbox 但是不用选matlab即可 1.找到之前安装时的Setup安装程序包&#xff0c;按照之前安装Matlab步骤&#xff0c;到选择需要安装的Ma…...

什么是消息键(Key)?如何使用消息键进行消息顺序性保证?

消息键&#xff08;Key&#xff09;是Kafka消息的一个可选属性&#xff0c;用于标识消息的逻辑关联关系。每条消息可以携带一个关键字作为其键&#xff0c;这个键可以是字符串、整数等数据类型。 使用消息键可以在Kafka中实现消息的顺序性保证&#xff0c;具体方式如下&#x…...

慎思笃行,兴业致远:金融行业的数据之道

《中庸》中说&#xff0c;“博学之&#xff0c;审问之&#xff0c;慎思之&#xff0c;明辨之&#xff0c;笃行之”。这段话穿越千年&#xff0c;指引着中国千行百业的发展。对于金融行业来说&#xff0c;庞大的数据量可以说是“博学”的来源。但庞大的数据体量&#xff0c;既是…...

Git-分支管理

文章目录 1.分支管理2.合并冲突3.合并模式4.补充 1.分支管理 Git分支管理是指在Git版本控制系统中&#xff0c;使用分支来管理项目的不同开发线路和并行开发的能力。通过分支&#xff0c;开发者可以在独立的环境中进行功能开发、bug修复等工作&#xff0c;而不会影响到主分支上…...

[Ubuntu 22.04] containerd配置HTTP方式拉取私仓Harbor

文章目录 1. 基础环境配置2. Docker安装3. 部署Harbor&#xff0c;HTTP访问4. 部署ContainerD5. 修改docker配置文件&#xff0c;向harbor中推入镜像6. 配置containerd6.1. 拉取镜像验证6.2. 推送镜像验证 1. 基础环境配置 [Ubuntu 22.04] 安装K8S基础环境准备脚本 2. Docker安…...

入门指南:深入解析OpenCV的copyTo函数及其与rect的应用场景

文章目录 导言copyTo函数的示例copyTo函数与rect的应用场景结论 导言 OpenCV是一个功能强大的开源计算机视觉库&#xff0c;广泛应用于图像处理和计算机视觉任务。在OpenCV中&#xff0c;copyTo函数是一个重要的图像处理函数&#xff0c;它允许我们在不同的图像之间复制像素数…...

2018年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

2018年1月真题 四、写作&#xff1a;第56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35分。 56.论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该论证的有…...

系统集成|第七章(笔记)

目录 第七章 范围管理7.1 项目范围管理概念7.2 主要过程7.2.1 规划范围管理7.2.2 收集需求7.2.3 定义范围7.2.4 创建工作分解结构 - WBS7.2.5 范围确认7.2.6 范围控制 上篇&#xff1a;第六章、整体管理 第七章 范围管理 7.1 项目范围管理概念 概述&#xff1a;项目范围管理就…...

Qt —— Vs2017编译hiredis源码并测试调用(附调用hiredis库源码)

下载hiredis源码 编译hiredis源码 1、解压下载的hiredis源码包,如图使用Vs2017打开hiredis_win.sln 2、如下两图,Vs2017打开.sln后点击升级。 分别对两个工程的debug、release进行配置。Debug配置为多线程调试DLL(MDd)、Release配置为多线程DLL(/MD),这样做是为了配合被调用…...

深入理解设计模式:设计模式定义、设计原则以及组织编目

文章目录 一、设计模式1.1 设计模式的起源1.2 设计模式的定义1.3 记录要素1.4 合理使用模式 二、设计模式的六大原则2.1 开闭原则(Open-Closed Principle, OCP)2.1.1 定义2.1.2 原则分析2.1.3 开闭原则的意义所在 2.2 单一职责原则(Single Responsibility Principle, SRP)2.4.1…...

鸿鹄协助管理华为云与炎凰Ichiban

炎凰对华为云的需求 在炎凰日常的开发中&#xff0c;对于服务器上的需求&#xff0c;我们基本都是采用云服务。目前我们主要选择的是华为云&#xff0c;华为云的云主机比较稳定&#xff0c;提供的云主机配置也比较多样&#xff0c;非常适合对于不同场景硬件配置的需求&#xff…...

Vite创建Vue+TS项目引入文件路径报错

使用vite搭建vue3脚手架的时候&#xff0c;发现main.ts中引入App.vue编辑器会报错&#xff0c;但是不影响代码运行。 报错信息&#xff1a;TS2307: Cannot find module ‘./App.vue’ or its corresponding type declarations. 翻译过来是找不到模块或者相关的声明类型&#…...

计算机里基本硬件的组成以及硬件协同

文章目录 冯诺依曼体系输入设备输出设备存储器运算器控制器协同工作的流程 冯诺依曼体系 世界上第一台通用计算机&#xff0c;ENIAC&#xff0c;于1946年诞生于美国一所大学。 ENIAC研发的前期&#xff0c;需要工作人员根据提前设计好的指令手动接线&#xff0c;以这种方式输入…...

2023软件设计师中级备考经验分享(文中有资料链接分享)

先摊结论吧&#xff0c;软考中级设计师备考只是备考半个月&#xff08;期间还摆烂了几天&#xff09;&#xff0c;然而成绩如下&#xff1a; 我自己都没想到会这么好的成绩。。。 上午题&#xff1a;推荐把软考通APP里的历年真题刷3-4遍&#xff0c;直接刷真题&#xff0c;然后…...

做网站主页效果图/网站权重等级

SR-IOV特性&#xff1a;能减少宿主机的CPU使用率&#xff0c;需要物理网卡支持该功能&#xff0c;并且有的主板需要开启VT-d功能&#xff0c;有的主板有单独的开启开关&#xff0c;如下图Dell R630基础环境准备&#xff1a;物理网卡:intel I350 ,系统环境&#xff1a;centos7.5…...

做pcr查基因序列的网站/关键词优化推广策略

Open 方法 (ADO Connection) 打开到数据源的连接。 语法 connection.Open ConnectionString,UserID, Password, Options 参数 ConnectionString 可选&#xff0c;字符串&#xff0c;包含连接信息。参阅ConnectionString 属性可获得有效设置的详细信息。 UserID 可选&…...

做网站的销售员电话话术/应用商店app下载

intro为什么需要link呢linker主要做了哪些工作呢目标文件ELF Symbol Link链接器变量Symbol ResolutionLocal SymbolLinker Symbol Rule Relocation Packaging Libstatic libariesDynamic liblib interpositioning 转载请注明出处&#xff1a;http://blog.csdn.net/c602273091/…...

网站建设智能优化/seo快速排名软件

下载redis源码&#xff1a;http://www.redis.io/ 在Linux下安装Redis非常简单&#xff0c;具体步骤如下&#xff08;官网有说明&#xff09;&#xff1a; 1、下载源码&#xff0c;解压缩后编译源码。 wget http://download.redis.io/releases/redis-2.8.3.tar.gz tar xzf redis…...

做学校后台网站/找网站设计公司

awesome-view 项目地址&#xff1a;xinghongfei/awesome-view 简介&#xff1a;自定义 View 有这些足够了 更多&#xff1a;作者 提 Bug 标签&#xff1a; 自定义view- 自定义 View 主要掌握以下四块内容&#xff1a; 绘制机制&#xff1a;掌握 onMeasure,onLayout,…...

wordpress登陆后查看/百度应用市场app下载

正点原子开拓者FPGA开发板上自带了一枚无源蜂鸣器&#xff0c;本篇将记录如何通过按键来控制蜂鸣器的开关。 功能描述 初始蜂鸣器不响&#xff0c;按键按一下蜂鸣器开始响&#xff0c;再按一下蜂鸣器停止。 模块结构 本次采用了三个模块&#xff0c;一个顶层模块&#xff0c;…...