01 动态数组

01 动态数组.cpp

#define _CRT_SECURE_NO_WARNING
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"dynamicarr.h"

void test01() {
	Dynamic_Array* MyArray = Init_Array();
	//容量大小
	printf("容量为%d\n", Capacity_Array(MyArray));
	printf("大小为%d\n", sise_Array(MyArray));

	for (int i = 0; i < 30; i++)
	{
		
		PushBack_Array(MyArray, i);
	}
	Print_Array(MyArray);
	//根据位置删除
	RemovePos_Array(MyArray, 3);
	//根据值删除
	RemoveValue_Array(MyArray, 29);
	Print_Array(MyArray);
	//容量大小
	printf("容量为%d\n", Capacity_Array(MyArray));
	printf("大小为%d\n", sise_Array(MyArray));

	//查找元素位置
	int pos = Find_Array(MyArray, 4);
	printf("4所在位置为:%d", At_Array(MyArray, pos));

	//销毁
	FreeSpeed_Array(MyArray);
	Print_Array(MyArray);
	

}
int main(void)
{
	test01();
	system("pause");
	return 0;
}

dynamicarr.c

#include "dynamicarr.h"

//初始化
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;
}
//插入
void PushBack_Array(Dynamic_Array* arr, int value) {
	
	if (arr == NULL) {
		return;
	}
	
	//判断空间是否足够插入, 
	if (arr->size == arr->capacity) {
		//第一步 申请2倍空间
		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 RemovePos_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--;

}
//根据value删除
void RemoveValue_Array(Dynamic_Array* arr, int value) {
	if (arr == NULL) {
		return;
	}
	//找到位置
	int pos = Find_Array(arr, value);

	//根据位置删除
	RemovePos_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) {
	if (arr == NULL) {
		return;
	}

	for (int i = 0; i < arr->size; i++)
	{
		printf("%d " ,arr->pAddr[i]);
	}
	
	printf("\n");
}

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

}

//清空数组
void Clear_Array(Dynamic_Array* arr)
{
	if (arr == NULL) {
		return;
	}
	arr->size = 0;

}
//获得动态数组容量
int Capacity_Array(Dynamic_Array* arr) {
	if (arr == NULL) {
		return -1;
	}
	return arr->capacity;
}
//获取动态数组当前容量个数
int sise_Array(Dynamic_Array* arr) {
	if (arr == NULL) {
		return -1;
	}
	return arr->size;
}
//根据位置获取某个元素
int At_Array(Dynamic_Array* arr, int pos) {
	return arr->pAddr[pos];
}

dynamicarr.h

#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//动态增长内存,策略将存放数据的内存放到那?堆上
//动态数组如果5个元素申请内存拷贝数据释放内存6插入第七个?
//容量capacity表示我的这块内存空间一共可以存放多少元素
//size概念记录当前数组中具体的元素个数

typedef struct DYNAMICARRAY
{
	int* pAddr; //存放数据地址
	int size; //当前多少个元素
	int capacity; //最大容量
}Dynamic_Array;

//写一套关于DYNAMICARRAY的结构体操作函数
//初始化
Dynamic_Array* Init_Array();
//插入
void PushBack_Array(Dynamic_Array* arr, int value);
//根据值删除
void RemovePos_Array(Dynamic_Array* arr, int pos);
//根据value删除
void RemoveValue_Array(Dynamic_Array* arr, int value);
//查找
int Find_Array(Dynamic_Array* arr, int value);
//打印
void Print_Array(Dynamic_Array* arr);

//释放动态数组内存
void FreeSpeed_Array(Dynamic_Array* arr);
//清空数组
void Clear_Array(Dynamic_Array* arr);
//获得动态数组容量
int Capacity_Array(Dynamic_Array* arr);
//获取动态数组当前容量个数
int sise_Array(Dynamic_Array* arr);
//根据位置获取某个元素
int At_Array(Dynamic_Array* arr, int pos);


#endif // !DYNAMIC_ARRAY_H