数据结构 1、基本概念 动态数组实现

一、大O表示法

判断一个算法的效率

难点

二、线性表

1.定义

2.数学定义

线性表是具有相同类型的n(n>=0)个数据元素的有限序列(a0,a1,a2,...,an),ai是表项,n是表长度

3.性质

4.线性表的基本操作

1.创建线性表

2.销毁线性表

3.清空线性表

4.将元素插入线性表

5.将元素从线性表中操作

6.将元素从线性表中删除

7.获取线性表中某个位置的元素

8.获取线性表的长度

4.存储方式

4.1 顺序存储

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素

动态数组案例

当插入一个新的元素时,空间不足?

1.申请一块更大的内存空间

2.将原空间的数据拷贝到新的空间

3.释放旧的空间

4.将元素放入新的空间

三、动态数组代码实现

0、定义动态数组的结构体

//定义动态数组的结构体
typedef struct DYNAMICARRY {int* pAddr;//存放数据的地址int size;//当前有多少元素int capacity;//容量,容器当前最大容纳元素
}Dynamic_Array;

1、动态数组的初始化

//动态数组的初始化
Dynamic_Array* Init_Array() {//申请内存Dynamic_Array* myArray = (Dynamic_Array*)malloc(sizeof(Dynamic_Array));//初始化myArray->size = 0;myArray->capacity = 20;//动态分配内存myArray->pAddr = (int*)malloc(sizeof(int) * myArray->capacity);return myArray;
}

2、插入新数据

//插入 value 插入的值
void PushBack_Array(Dynamic_Array* arr, int value) {//判断数组长度是否为0if (arr == NULL) {return;}//判断空间是否足够 capacity记录当前数组空间长度 size==capacity数组已满if (arr->size == arr->capacity) {//第一步 申请一块更大的内存空间 默认新空间是旧空间的两倍int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);//第二步 拷贝数据到新的空间 newSpace新空间 arr->pAddr旧空间memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));//第三步 释放旧的内存free(arr->pAddr);//经过上述步骤 释放完毕//更新容量 旧空间到新空间arr->capacity = arr->capacity * 2;arr->pAddr = newSpace;}//插入元素 size记录当前数组中具体的元素个数arr->pAddr[arr->size] = value;arr->size++;
}

3、根据元素位置删除

//根据位置删除
void RemoveByPos_Array(Dynamic_Array* arr, int pos) {if (arr == NULL) {printf("数组为空\n");return;}//判断位置是否有效if (pos < 0||pos>=arr->size) {printf("数组位置无效\n");return;}else {//删除元素 pos是被删除位置 从被删除位置向后遍历 将元素往后更新for (int i = pos; i < arr->size-1; i++) {arr->pAddr[i] = arr->pAddr[i + 1];}//当前数组存储元素数减一arr->size--;}
}

4、根据元素值删除第一次该值出现的位置

//根据值删除value第一次出现的位置
void RemoveByValue_Array(Dynamic_Array* arr, int value) {//判空操作if (arr == NULL) {return;}//找到值的位置 找到value值在数组arr中第一次出现的位置int pos = -1;for (int i = 0; i < arr->size; i++){if (arr->pAddr[i] == value) {pos = i;break;}}// 根据value值出现的位置删除位置删除RemoveByPos_Array(arr, pos);
}

5、查找

//查找
int Find_Array(Dynamic_Array* arr, int value) {//对数组进行判空if (arr == NULL) {return -1;}//查找//找到值的位置int pos = -1;for (int i = 0; i < arr->size; i++){if (arr->pAddr[i] == value) {pos = i;break;}}for (int i = 0; i < arr->size; i++){if (arr->pAddr[i] == value) {pos = i;break;}}return pos;
}

6、打印

//打印
void Print_Array(Dynamic_Array* arr) {if (arr == NULL) {return;}for (int i = 0; i < arr->size; i++){printf("%d ", arr->pAddr[i]);}printf("\n");
}

7、释放动态数组的内存

//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr) {if (arr == NULL) {return;}if (arr->pAddr != NULL) {free(arr->pAddr);}free(arr);
}

8、清空数组

//清空数组
void Clear_Array(Dynamic_Array* arr) {if (arr == NULL) {return;}//pAddr指向的空间直接为0arr->size = 0;
}

9、获得动态数组的容量capacity

//获得动态数组容量
int Capacity_Array(Dynamic_Array* arr) {if (arr == NULL) {return -1;}return arr->capacity;
}

10、获得动态数组当前元素个数

//获得动态数组当前元素个数
int Size_Array(Dynamic_Array* arr) {if (arr == NULL) {return -1;}return arr->size;
}

11、根据位置,获得数组中某个位置的元素

//根据位置 获得某个位置的元素
int At_Array(Dynamic_Array* arr, int pos) {return arr->pAddr[pos];
}

四、函数测试

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
#include <math.h>#include "动态数组.h"//方法定义在源文件动态数组.c中//11.12 动态数组
//动态增长内存,将存放的数据放在堆上
//动态数组 申请内存 拷贝数据 释放内存 插入多一个元素
//容量capacity 表示我的这块内存空间一共可以存放多少元素
//size概念 记录当前数组中具体的元素个数void test01() {//初始化一个动态数组Dynamic_Array* myArray = Init_Array();//打印数组容量printf("数组容量:%d\n", Capacity_Array(myArray));printf("数组大小:%d\n", Size_Array(myArray));//插入元素for (int i = 0; i < 30; i++) {PushBack_Array(myArray , i);}printf("数组容量:%d\n", Capacity_Array(myArray));printf("数组大小:%d\n", Size_Array(myArray));//打印Print_Array(myArray);//根据位置删除value第一次出现的位置RemoveByPos_Array(myArray, 0);Print_Array(myArray);//根据值删除元素RemoveByValue_Array(myArray, 28);Print_Array(myArray);//打印//查找第五个位置的元素int pos=Find_Array(myArray,5);printf("5查找到:pos:%d %d\n", pos, At_Array(myArray, pos));//销毁FreeSpace_Array(myArray);
}int main()
{test01();system("pause");return 0;
}

测试结果

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

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

相关文章

微软允许OEM对Win10不提供关闭Secure Boot

用户可能将无法在Windows 10电脑上安装其它操作系统了&#xff0c;微软不再要求OEM在UEFI 中提供的“关闭 Secure Boot”的选项。 微软最早是在Designed for Windows 8认证时要求OEM的产品必须支持UEFI Secure Boot。Secure Boot 被设计用来防止恶意程序悄悄潜入到引导进程。问…

论文精读 MediaPipe BlazeFace

BlazeFace:Sub-millisecond Neural Face Detection on Mobile GPUs BlazeFace&#xff1a;基于移动GPUs的亚毫秒神经人脸检测 论文地址&#xff1a;arxiv.org/pdf/1907.05047.pdf 源码地址&#xff1a;GitHub - tkat0/PyTorch_BlazeFace: Unofficial PyTorch implementation…

【OpenVINO】基于 OpenVINO C# API 部署 RT-DETR 模型

基于 OpenVINO C# API 部署 RT-DETR 模型 1. RT-DETR2. OpenVINO3. 环境配置4. 模型下载与转换5. C#代码实现5.1 模型推理类实现1. 模型推理类初始化2. 图片预测API 5.2 模型数据处理类RTDETRProcess1. 定义RTDETRProcess2. 输入数据处理方法3. 预测结果数据处理方法 6. 预测结…

【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解

【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解前言GoogLeNet(InceptionV1)讲解Inception结构InceptionV1结构1x1卷积的作用辅助分类器 GoogLeNet(Inceptio…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

虚拟化服务器+华为防火墙+kiwi_syslog访问留痕

一、适用场景 1、大中型企业需要对接入用户的访问进行记录时&#xff0c;以前用3CDaemon时&#xff0c;只能用于小型网络当中&#xff0c;记录的数据量太大时&#xff0c;本例采用破解版的kiwi_syslog。 2、当网监、公安查到有非法访问时&#xff0c;可提供基于五元组的外网访…

SPI协议详解

SPI协议详解 文章目录 SPI协议详解前言一、SPI是什么&#xff1f;二、通信原理SPI 通信的 4 种工作模式 总结 前言 好久没写这种协议了&#xff0c;最近正好需要用到&#xff0c;便详细的复习一下。 一、SPI是什么&#xff1f; SPI是串行外设接口&#xff08;Serial Periphe…

MES系统如何赋能制造企业实现4M防错追溯?

生产过程4M管理和MES系统的结合是现代制造业中关键的质量管理实践&#xff0c;它有助于提高生产效率、降低生产成本并保证产品质量。本文将深入探讨4M管理的概念&#xff0c;以及MES系统如何赋能制造企业实现4M防错追溯。 一、4M管理的概念 4M管理是指在制造过程中管理和控制四…

leetCode 92.反转链表 II + 图解

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 206. 反转链表 - 力扣&#xff08;LeetCode&am…

区块链链游合约系统开发项目模式技术方案

​随着区块链技术的发展&#xff0c;链游合约系统开发逐渐成为了一个备受关注的项目。本文将探讨区块链链游合约系统开发项目的技术方案&#xff0c;包括项目背景、开发目标、技术架构、系统流程、安全措施等方面的内容。 一、项目背景 链游是一种基于区块链技术的游戏&#xf…

加密磁盘密钥设置方案浅析 — LUKS1

虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验key slot格式其它字段 流程验证 前言 我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案&#xff0c;TKS1对密钥设置(Linux Unified Key Setup)的流程和方…

阿里云容器镜像服务的运维总结

一、背景 容器镜像服务&#xff0c;作为一个可选付费产品&#xff0c;主要作用是存储docker的镜像仓库&#xff0c;供k8s拉取到Pod节点里。 你可以自己搭建一个harbor镜像仓库&#xff0c;在公司的开发环境下&#xff0c;将image推送到仓库&#xff1b;然后在生产k8s从仓库拉取…

ECharts:显示暂无数据

ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求&#xff0c;实现各种炫酷的统计图表效果。 如上图所示&#xff0c;有数据的时候固然好看&#xff0c;但是当它没有数据的时候&#xff0c;就是光秃秃的一片&#xff0c;所…

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值&#xff0c;通过遍历数列&#xff0c;将数列分成两个子数列&#xff1a;小于基准值数列、大于基准值数列&#xff0c;准确来说还有个子数列&#xff1a;等于基准值即&#xff1a; 算法图解 选出基准元素pivot&#xff08;可以选择…

[文件读取]shopxo 文件读取(CNVD-2021-15822)

1.1漏洞描述 漏洞编号CNVD-2021-15822漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: ShopXO是一套开源的企业级开源电子商务系统。 ShopXO存在任意文件读取漏洞&#xff0c;攻击者可利用该漏洞获取敏感信息。 1.2漏洞等级 高危 1.3影响版本 ShopXO 1.4漏洞复现…

【Git】第一篇:Git安装(centos)

git查看安装版本 以我自己的centos7.6为例&#xff0c;我们可以输入以下指令查看自己是否安装了git. git --version安装了的话就会显示自己安装的版本。 git 安装 安装很简单&#xff0c;一条命令即可 sudo yum install git -ygit 卸载 sudo yum remove git -y

《使用EasyExcel在Excel中增加序号列的方法》

《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时&#xff0c;有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能&#xff0c;并提供了一个示例代码。 2、正文 在处理…

Android 图层列表 、 LayerDrawable 、 layer-list \ 改变 seekbar thumb 滑块 的颜色

android 官网 &#xff1a; 图层列表 LayerDrawable / layer-list LayerDrawable 是管理其他可绘制对象数组的可绘制对象。列表中的每个可绘制对象均按照列表顺序绘制。列表中的最后一个可绘制对象绘于顶部。 每个可绘制对象均由单个 <layer-list> 元素内的 <item>…

【服务发现与配置】Consul特性及搭建

文章目录 一、前言二、概念2.1、什么是Consul&#xff1f;2.2、Consul具有哪些特点?2.3、Consul 架构图2.4、Consul的使用场景 三、安装3.1. 下载3.2. 解压3.3. 拷贝到usr目录下3.4. 查看 安装是否成功3.5. 启动 四、Consul 开机自启动4.1. 路径/usr/lib/systemd/system/&…

前端开发项目中使用字体库

开发中有些项目要求使用固定的字体&#xff0c;这就需要项目中使用字体库。 首先需要下载字体库 将下载的字体文件放进项目中 在项目代码样式文件中定义字体 font-face {font-family: "Tobias-SemiBold";src: url("./assets/font/Tobias-SemiBold.ttf"…