数据结构---动态数组

 一、数据结构基本理论

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。强调数据元素之间的关系

算法五个特性:
        输入、输出、有穷、确定、可行

数据结构分类:
        逻辑结构:集合、线性结构、树形结构、图形结构

        物理结构:顺序存储、链式存储、索引存储、散列存储(哈希存储)

二、动态数组实现

1.设计

        struct dynamicArray

        属性:
        void ** pAddr  维护真实在堆区创建的数组的指针

        int capacity;  数组容量·
        int m_size;  数组大小

2.动态数组初始化

struct dynamicArray* init_DynamicArray(int capacity);

3.插入数组

void insert_DynamicArray(struct dynamicArray* array, int pos, void* data);

4.遍历数组

void foreach_DynamicArray(struct dynamicArray* array, void(*myPrint)(void*));

5.删除数组

按位置删除

void removeByPos_DynamicArray(struct dynamicArray* array, int pos);

按值删除数据

void removeByValue_DynamicArray(struct dynamicArray* array, void* data, int(*myCompare)(void*, void*));

6.销毁数组

void destroy_DynamicArray(struct dynamicArray* array);

代码如下: 

#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//动态数组结构体
struct dynamicArray
{void** pAddr;//维护真实在堆区创建的数组的指针int m_capacity;//数组容量int m_size;//数组大小
};//初始化数组
struct dynamicArray* init_DynamicArray(int capacity)
{if (capacity <= 0){return NULL;}//给数组分配空间struct dynamicArray* array = malloc(sizeof(struct dynamicArray));if (array == NULL){return NULL;}array->pAddr = malloc(sizeof(void*) * capacity);array->m_capacity = capacity;array->m_size = 0;return array;
};//插入数据
void insert_DynamicArray(struct dynamicArray *array,int pos,void *data)
{if (array == NULL) {return;}if (data == NULL){return;}//无效位置	尾插if (pos < 0 || pos > array->m_size){pos = array->m_size;}//判断是否满了,如果满了动态扩展if (array->m_size == array->m_capacity){//1.申请更大的内存空间int newCapacity = array->m_capacity * 2;//2.创建空间void** newSpace = malloc(sizeof(void*) * newCapacity);//3.将原有的数据拷贝到新空间下memcpy(newSpace, array->pAddr, sizeof(void*) * array->m_capacity);//4.释放原有内存空间free(array->pAddr);//5.更新新空间指向array->pAddr = newSpace;//6.更新新容量array->m_capacity = newCapacity;}//插入新元素//移动元素	进行插入新元素 for (int i = array->m_size - 1; i >= pos; i--){//数据向后移动array->pAddr[i + 1] = array->pAddr[i];}//将新元素插入到指定位置上array->pAddr[pos] = data;//更新大小array->m_size++;
};//遍历数组
void foreach_DynamicArray(struct dynamicArray* array,void(*myPrint)(void *))
{if (array == NULL){return;}if (myPrint == NULL){return;}for (int i = 0; i < array->m_size; i++){myPrint(array->pAddr[i]);}
}//删除数组	按位置删除
void removeByPos_DynamicArray(struct dynamicArray * array, int pos)
{if (NULL == array){return;}if (pos < 0 || pos > array->m_size - 1){return;}//数据前移for (int i = pos; i < array->m_size - 1; i++){array->pAddr[i] = array->pAddr[i + 1];}//更新数组大小array->m_size--;}	//按值删除数据
void removeByValue_DynamicArray(struct dynamicArray *array,void *data,int(* myCompare)(void *,void *))
{if (array == NULL){return;}if (data == NULL){return;}for (int i = 0; i < array->m_size; i++){if (myCompare(array->pAddr[i], data)){//如果找到要删除的数据,i就是要删除的具体位置removeByPos_DynamicArray(array, i);break;}}
}//销毁数组
void destroy_DynamicArray(struct dynamicArray* array)
{if (array == NULL){return;}if (array->pAddr != NULL){free(array->pAddr);array->pAddr = NULL; }free(array);array = NULL;
}//测试
struct Person
{char name[64];int age;
};void myPrintPerson(void* data)
{struct Person* p = data;printf("姓名:%s 年龄:%d\n", p->name, p->age);
}int myComparePerson(void *data1, void *data2)
{struct Person* p1 = data1;struct Person* p2 = data2;return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
int main()
{//初始化动态数组struct dynamicArray* array = init_DynamicArray(5);//准备数据struct Person p1 = { "亚瑟",18 };struct Person p2 = { "妲己",20 };struct Person p3 = { "安其拉",19 };struct Person p4 = { "凯",21 };struct Person p5 = { "孙悟空",999 };struct Person p6 = { "李白",999 };printf("插入数据前容量:%d 大小:%d\n", array->m_capacity, array->m_size);//插入数据insert_DynamicArray(array, 0, &p1);insert_DynamicArray(array, 0, &p2);insert_DynamicArray(array, 1, &p3);insert_DynamicArray(array, 0, &p4);insert_DynamicArray(array, -1, &p5);insert_DynamicArray(array, 2, &p6);//凯  妲己  李白  安其拉  亚瑟  孙悟空//遍历数组foreach_DynamicArray(array, myPrintPerson);printf("插入数据后容量:%d 大小:%d\n", array->m_capacity, array->m_size);//测试删除	按位置删除removeByPos_DynamicArray(array, 2);printf("-------------------\n");foreach_DynamicArray(array, myPrintPerson);printf("删除数据后容量:%d 大小:%d\n", array->m_capacity, array->m_size);struct Person p = { "亚瑟",18 };removeByValue_DynamicArray(array, &p,myComparePerson);printf("-------------------\n");foreach_DynamicArray(array, myPrintPerson);printf("删除数据后容量:%d 大小:%d\n", array->m_capacity, array->m_size);//销毁数组destroy_DynamicArray(array);array = NULL;return 0;
}

三、实现分文件编写 

dynamicArray.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//动态数组结构体
struct dynamicArray
{void** pAddr;//维护真实在堆区创建的数组的指针int m_capacity;//数组容量int m_size;//数组大小
};//初始化数组
struct dynamicArray* init_DynamicArray(int capacity);//插入数据
void insert_DynamicArray(struct dynamicArray* array, int pos, void* data);//遍历数组
void foreach_DynamicArray(struct dynamicArray* array, void(*myPrint)(void*));//删除数组	按位置删除
void removeByPos_DynamicArray(struct dynamicArray* array, int pos);//按值删除数据
void removeByValue_DynamicArray(struct dynamicArray* array, void* data, int(*myCompare)(void*, void*));//销毁数组
void destroy_DynamicArray(struct dynamicArray* array);

dynamicArray.c

#include"dynamicArray.h"//初始化数组
struct dynamicArray* init_DynamicArray(int capacity)
{if (capacity <= 0){return NULL;}//给数组分配空间struct dynamicArray* array = malloc(sizeof(struct dynamicArray));if (array == NULL){return NULL;}array->pAddr = malloc(sizeof(void*) * capacity);array->m_capacity = capacity;array->m_size = 0;return array;
};//插入数据
void insert_DynamicArray(struct dynamicArray *array,int pos,void *data)
{if (array == NULL) {return;}if (data == NULL){return;}//无效位置	尾插if (pos < 0 || pos > array->m_size){pos = array->m_size;}//判断是否满了,如果满了动态扩展if (array->m_size == array->m_capacity){//1.申请更大的内存空间int newCapacity = array->m_capacity * 2;//2.创建空间void** newSpace = malloc(sizeof(void*) * newCapacity);//3.将原有的数据拷贝到新空间下memcpy(newSpace, array->pAddr, sizeof(void*) * array->m_capacity);//4.释放原有内存空间free(array->pAddr);//5.更新新空间指向array->pAddr = newSpace;//6.更新新容量array->m_capacity = newCapacity;}//插入新元素//移动元素	进行插入新元素 for (int i = array->m_size - 1; i >= pos; i--){//数据向后移动array->pAddr[i + 1] = array->pAddr[i];}//将新元素插入到指定位置上array->pAddr[pos] = data;//更新大小array->m_size++;
};//遍历数组
void foreach_DynamicArray(struct dynamicArray* array,void(*myPrint)(void *))
{if (array == NULL){return;}if (myPrint == NULL){return;}for (int i = 0; i < array->m_size; i++){myPrint(array->pAddr[i]);}
}//删除数组	按位置删除
void removeByPos_DynamicArray(struct dynamicArray * array, int pos)
{if (NULL == array){return;}if (pos < 0 || pos > array->m_size - 1){return;}//数据前移for (int i = pos; i < array->m_size - 1; i++){array->pAddr[i] = array->pAddr[i + 1];}//更新数组大小array->m_size--;}	//按值删除数据
void removeByValue_DynamicArray(struct dynamicArray *array,void *data,int(* myCompare)(void *,void *))
{if (array == NULL){return;}if (data == NULL){return;}for (int i = 0; i < array->m_size; i++){if (myCompare(array->pAddr[i], data)){//如果找到要删除的数据,i就是要删除的具体位置removeByPos_DynamicArray(array, i);break;}}
}//销毁数组
void destroy_DynamicArray(struct dynamicArray* array)
{if (array == NULL){return;}if (array->pAddr != NULL){free(array->pAddr);array->pAddr = NULL; }free(array);array = NULL;
}

测试:

#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>
#include<string.h>
#include<stdlib.h>#include"dynamicArray.h"//测试
struct Person
{char name[64];int age;
};void myPrintPerson(void* data)
{struct Person* p = data;printf("姓名:%s 年龄:%d\n", p->name, p->age);
}int myComparePerson(void *data1, void *data2)
{struct Person* p1 = data1;struct Person* p2 = data2;return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
int main()
{//初始化动态数组struct dynamicArray* array = init_DynamicArray(5);//准备数据struct Person p1 = { "亚瑟",18 };struct Person p2 = { "妲己",20 };struct Person p3 = { "安其拉",19 };struct Person p4 = { "凯",21 };struct Person p5 = { "孙悟空",999 };struct Person p6 = { "李白",999 };printf("插入数据前容量:%d 大小:%d\n", array->m_capacity, array->m_size);//插入数据insert_DynamicArray(array, 0, &p1);insert_DynamicArray(array, 0, &p2);insert_DynamicArray(array, 1, &p3);insert_DynamicArray(array, 0, &p4);insert_DynamicArray(array, -1, &p5);insert_DynamicArray(array, 2, &p6);//凯  妲己  李白  安其拉  亚瑟  孙悟空//遍历数组foreach_DynamicArray(array, myPrintPerson);printf("插入数据后容量:%d 大小:%d\n", array->m_capacity, array->m_size);//测试删除	按位置删除removeByPos_DynamicArray(array, 2);printf("-------------------\n");foreach_DynamicArray(array, myPrintPerson);printf("删除数据后容量:%d 大小:%d\n", array->m_capacity, array->m_size);struct Person p = { "亚瑟",18 };removeByValue_DynamicArray(array, &p,myComparePerson);printf("-------------------\n");foreach_DynamicArray(array, myPrintPerson);printf("删除数据后容量:%d 大小:%d\n", array->m_capacity, array->m_size);//销毁数组destroy_DynamicArray(array);array = NULL;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

算法提高之能量项链

算法提高之能量项链 核心思想&#xff1a;区间dp 通过观察发现可以将n个珠子最后的n1个数看作石子 合并石子 在l~r的范围内 找k作隔断 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110,M N<<…

纯血鸿蒙APP实战开发——底部面板嵌套列表滑动案例

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表&#xff0c;分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”&#xff0c;弹出panel面板。在panel半展开时&#xff0c;手指向上滑动panel高度充满页面&#xff0c;手指向下滑动panel隐藏。在panel完全展开…

硬盘惊魂!文件夹无法访问怎么办?

在数字时代&#xff0c;数据的重要性不言而喻。然而&#xff0c;有时我们会遇到一个令人头疼的问题——文件夹提示无法访问。当你急需某个文件夹中的文件时&#xff0c;却被告知无法打开&#xff0c;这种感受真是难以言表。今天&#xff0c;我们就来深入探讨这个问题&#xff0…

2024/5/7 QTday2

练习&#xff1a;优化登录框&#xff0c;输入完用户名和密码后&#xff0c;点击登录&#xff0c;判断账户是否为 Admin 密码 为123456&#xff0c;如果判断成功&#xff0c;则输出登录成功&#xff0c;并关闭整个登录界面&#xff0c;如果登录失败&#xff0c;则提示登录失败&a…

关系型数据库MySQL开发要点之多表设计案例详解代码实现

什么是多表设计 项目开发中 在进行数据库表结构设计时 根据数据模型和业务关系 会根据业务需求和业务模块之间的关系分析设计表结构 由于业务之间互相关联 所以表结构之间也存在着各种联系 主要分为以下三种 一对多 每个部门下是有多个员工的 但是一个员工只能归属一个部…

yolo world 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署

特别说明&#xff1a;参考官方开源的 yoloworld 代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 yoloworld出来的有一段时间了&#xff0c;还没有盘到板端上玩一玩…

【Linux系列】file命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

普通人可以做什么兼职副业?推荐7 种卖情怀的生意,小众高利润

一瓶茅台&#xff0c;尽管成本仅为70元&#xff0c;但其建议零售价却高达1499元&#xff0c;而在市场上的流通价格更是突破了2600元大关。同样的一款手提包&#xff0c;在网络上仅售几百元&#xff0c;但一旦贴上了LV的标志&#xff0c;其售价便瞬间飙升至一万多元。这究竟是为…

kafka学习笔记(三、生产者Producer使用及配置参数)

1.简介 1.1.producer介绍 生产者就是负责向kafka发送消息的应用程序。消息在通过send()方法发往broker的过程中&#xff0c;有可能需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用后才能被真正的发往broker。 demo: public class Kafk…

【嵌入式必读】一文彻底理解PID自整定及PID自整定代码设计

文章目录 1. 前言2. PID简介3. 常用的PID自整定方法3.1 临界度比例法3.2 衰减曲线法 4. 继电反馈整定法原理4.1 继电反馈自整定的基本思想4.2 继电反馈自整定原理 5. 算法设计5.1 振荡的生成5.2 提取出临界周期 T c T_c Tc​和振荡波形幅值 A A A5.3 计算出PID参数 6 原代码6.1…

VmWare 虚拟机没有网络解决办法

由于最近需要&#xff0c;装了个VM虚拟机&#xff0c;但是突然发现本机有网络&#xff0c;虚拟机却没有网络&#xff0c;更换了虚拟机的网络设置&#xff0c;都尝试过了 都不管用&#xff0c; 最后尝试了这种方法完美解决 还原网络默认设置 首先还原虚拟网络编辑器设置 启动V…

小程序开通wx.getlocation接口原来还有这个方法

小程序地理位置接口有什么功能&#xff1f; 在平时我们在开发小程序时&#xff0c;难免会需要用到用户的地理位置信息的功能&#xff0c;小程序开发者开放平台新规要求如果没有申请开通微信小程序地理位置接口( getLocation )&#xff0c;但是在代码中却使用到了相关接口&#…

软件开发者如何保护自己的知识产权?

最近一个关于开源软件的知识产权纠纷的案例&#xff0c;非常有代表性&#xff0c; 其中涉及到的平台openwrt&#xff0c;一口君十几年前曾玩过&#xff0c; 通过这个案例&#xff0c;我们可以学习如何在今后工作中保护自己的知识产权&#xff0c; 以及如何合理直接或者间接利…

08 - 条件判断语句

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 条件判断语句2. 语法说明3. 经验4. 代码 1. 条件判断语句 makefile 中支持条件判断语句 可以根据条件的值来决定 make 的执行可以比较两个不同变量或者变量和常量的值 注&#xff1a;条件判断语句只能用于控制 make 实际执行的…

zabbix监控方式(zabbix-trapper)

中文&#xff1a;zabbix采集器&#xff0c;即zabbix sender 。 Zabbix-Trapper 监控方式可以一次批量发送数据给Zabbix Server&#xff0c;与主动模式不同&#xff0c;Zabbix-Trapper 可以让用户控制数据的发送&#xff0c;而不用Zabbix-Agent进程控制&#xff0c;这意味着可以…

品深茶的抗癌功能是否涉及虚假宣传?

品深茶说到底&#xff0c;本质还是中国传统茶叶&#xff0c;茶叶本就是一种含有多种成分的饮品&#xff0c;包括茶多酚、生物碱、氨基酸、有机酸等。这些成分对人体有一定的益处&#xff0c;如抗氧化、抗炎、抗菌等作用。 一些研究表明&#xff0c;茶叶中的某些成分如茶多酚、…

C语言----汉诺塔问题

1.什么是汉诺塔问题 简单来说&#xff0c;就是有三个柱子&#xff0c;分别为A柱&#xff0c;B柱&#xff0c;C柱。其中A柱从上往下存放着从小到大的圆盘&#xff0c;我们需要借助B柱和C柱&#xff0c;将A柱上的所有圆盘转移到C柱上&#xff0c;并且一次只能移动一个圆盘&#…

用户管理中心——数据库设计用户注册逻辑设计

用户管理中心——数据库设计&用户注册逻辑设计 规整项目目录1. 数据库自动生成器的使用实现基本的数据库操作&#xff08;操作user表&#xff09; 2. 注册逻辑的设计(1) 写注册逻辑(2) 实现(3) 测试代码 3. 遇到的问题 规整项目目录 utils–存放工具类&#xff0c;比如加密…

Jsoncpp介绍

1.简介 Jsoncpp 是一个 C 库&#xff0c;用于解析和生成 JSON 数据。它提供了一个易于使用的 DOM&#xff08;Document Object Model&#xff09;风格的 API&#xff0c;允许开发者以树形结构的方式操作 JSON 数据。 Jsoncpp 是一个C库&#xff0c;允许操作JSON值&#xff0c;…

【软测学习笔记】Python入门Day02

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;软件测试笔记 &#x1f4da;参考教程&#xff1a;黑马教程❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ python安装 1、进入Python的官方下载页面&#xff1a; Download Python | Py…