在C语言中静态数组可以直接定义数组实现,但是动态数组的实现就需要借助指针,结构体等方法实现。
int a[100];//定义整型数组,其大小为100
char b[100];//定义字符型数组,其大小为100
/*上述数组的空间大小是固定的,添加删除都有标准的函数可以调用
但是这对于正常的程序来说是不够的
我们随时可能要修改数组空间,动态的规划数组的大小,节省内存空间,
提升代码的效率这时就需要用到动态数组
*/
1. 定义结构体和函数
在写动态数组前要考虑到定义动态数组那么就不能直接定义,这是就需要定义结构体来定义数组,其中结构体中的成员变量就是我们要考虑的:
根据数组的定义以及使用我们定义了以下结构体:
1.数组首地址:数组是连续排序的,所以直接给出首地址就可以依次查找到全部的数据元素
2…最大元素个数:获取动态数组中最多可以包含多少个元素
3.当前空间内的元素个数:方便动态数组的增删改查
动态数组中的元素类型是可变的所以这里不需要知道元素的所占空间大小。
struct dynamic_arr
{
//动态数组的元素的首地址数组定义为一级指针,这里使用二级指针可以修改首地址
void **addr;
//存储数组的最大元素个数
int space;
//当前存储数据的空间内的元素个数
int size;
};
为了动态数组的使用使用头文件对要实现的函数进行声明
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#ifdef __cplusplus
extern "C"{
#endif // __cplusplus
struct dynamic_arr
{
//动态数组的元素的首地址
void **addr;
//存储数组的最大元素个数
int space;
//当前存储数据的空间内的元素个数
int size;
};
//初始化列表
struct dynamic_arr * Initialize_array(int space);
//插入数组元素
void Insert_array(struct dynamic_arr *arr,int pos,void *data);
//遍历数组元素
void Print_array(struct dynamic_arr *arr,void ( *printf_array)(void *));
//删除元素1.位置
void Remove_arr(struct dynamic_arr *arr ,int pos);
//删除元素2.数据
void Remove_arr1(struct dynamic_arr *arr ,void * data,int (*campara)(void *,void *));
//销毁动态数组
void Destroy_arr(struct dynamic_arr *arr);
#ifdef __cplusplus
}
#endif // __cplusplus
2.函数实现
#include"Dynamicarray.h"
//导入头文件
//首先实现动态数组的初始化函数
struct dynamic_arr * Initialize_array(int space)
{
//如果最大空间小于0则直接返回