头文件 dynamic_array.h
#pragma once
#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#include<stdlib.h>
#include<stdio.h>
#include<string>
typedef struct dynamic_array
{
//存放数据的地址
int* dynamic_array;
//当前有多少元素
int size;
//容器,当前能容纳多少元素
int capacity;
//首地址
int* pAddr;
}Dynamic_Array;
//一系列相关的对结构体操作的函数
//初始化
Dynamic_Array * InitList();
//插入
void PushBack_Array(Dynamic_Array* arr, int value);
//根据位置删除
void RemoveByPos_Array(Dynamic_Array* arr, int pos);
//根据值删除
void RemoveByValue_Array(Dynamic_Array* arr, int value);
//查找
int Find_Array(Dynamic_Array* arr, int value);
//打印
void Print_Array(Dynamic_Array* arr);
//释放动态数组内存
void FreeSpace_Array(Dynamic_Array* arr);
//清空数组
void Clear_Array(Dynamic_Array* arr);
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr);
//获得动态数据当前元素个数
int Size_Array(Dynamic_Array* arr);
//根据位置获得某个位置元素
int At_Array(Dynamic_Array*arr, int pos);
#endif
源文件 dynamic_array.cpp
#include "dynamic_array.h"
//一系列相关的对结构体操作的函数
//初始化
Dynamic_Array* InitList() {
//申请内存
Dynamic_Array* myArray=(Dynamic_Array*)malloc(sizeof(Dynamic_Array));
myArray->capacity = 20;
myArray->size = 0;
myArray->pAddr = (int*)malloc(sizeof(int) * myArray->capacity);
return myArray;
}
//插入
//分三步
void PushBack_Array(Dynamic_Array* arr, int value) {
if (arr->pAddr == NULL)
{
return;
}
//判断空间是否足够
if (arr->size==arr->capacity)
{
//第一步 申请空间是原来的两倍
int* newSpace =(int *) malloc(sizeof(int) * arr->capacity * 2);
//第二步 拷贝数据到新的空间
memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
//第三步 释放就空间的内存
free(arr->pAddr);
//更新容量
arr->capacity = arr->capacity * 2;
arr->pAddr = newSpace;
}
//插入新元素 从尾部插入
arr->pAddr[arr->size] = value;
arr->size++;
}
//根据位置删除
void RemoveByPos_Array(Dynamic_Array* arr, int pos) {
if (arr == NULL)
return;
//判断位置是否有效
if (pos<0 || pos>=arr->size)
{
return;
}
//删除元素
for (int i = pos; i < arr->size-1; i++)
{
arr->pAddr[i] = arr->pAddr[i + 1];
}
arr->size--;
}
//根据值删除
void RemoveByValue_Array(Dynamic_Array* arr, int value) {
if (arr == NULL)
return;
//找到值的位置 用遍历
int pos = -1;
for (int i = 0; i < arr->size; i++)
{
if (arr->pAddr[i] == value)
pos = i;
}
//根据位置删除 调用函数
RemoveByPos_Array(arr, pos);
}
//查找
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;
}
return pos;
}
//打印
void Print_Array(Dynamic_Array* arr) {
for (int i = 0; i < arr->size; i++)
{
printf("%d", arr->pAddr[i]);
}
printf("\n");
}
//释放动态数组内存
void FreeSpace_Array(Dynamic_Array* arr) {
if (arr->pAddr == NULL)
{
return;
}
if (arr->pAddr != NULL)
{
free(arr->pAddr);
}
free(arr);
}
//清空数组
void Clear_Array(Dynamic_Array* arr) {
if (arr->pAddr == NULL)
{
return;
}
//直接让size=0;就无法访问数组元素了
arr->size = 0;
}
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr) {
if (arr->pAddr == NULL)
{
return-1;
}
return arr->capacity;
}
//获得动态数据当前元素个数
int Size_Array(Dynamic_Array* arr) {
if (arr == NULL)
return-1;
return arr->size;
}
//根据位置获得某个位置元素
int At_Array(Dynamic_Array*arr, int pos) {
if (arr->pAddr == NULL)
{
return-1;
}
return arr->pAddr[pos];
}
void test01()
{
//初始化动态数组
Dynamic_Array* myArray = InitList();
//打印容量
printf("%d\n", myArray->capacity);
printf("%d\n", myArray->size);
//插入元素
for (int i = 0; i < 30; i++)
{
PushBack_Array(myArray, i);
}
//打印
Print_Array(myArray);
//打印容量
printf("%d\n", myArray->capacity);
printf("%d\n", myArray->size);
//销毁
FreeSpace_Array(myArray);
}
int main()
{
test01();
system("pause");
return 0;
}```