DynamicArray.h
#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//动态数组结构体
typedef struct DYNAMICARRAY {
int* pAddr; //具体存放数据的地址
int size; //当前有多少个元素
int capacity; //数组容量(当前最大的容量)
} Dynamic_Array;
typedef struct LINKNODE {
void * data;
}linkNode;
//写一系列对DYNAMICARRAY结构体操作的函数
//初始化
Dynamic_Array * Init_Array();
//插入(默认尾部插入)
void Push_Back_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
DynamicArray.c
#include"DynamicArray.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->pAddr = (int *)malloc(sizeof(int)*myArray->capacity);
return myArray;
}
//插入(默认尾部插入)
void Push_Back_Array(Dynamic_Array *arr, int value)
{
if (arr == 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)
{
arr->size = pos;
}
//删除元素
//将删除元素后面的元素直接往前一个覆盖。最后size--
for (int i = pos; i < arr->size-1; i++) //防止最后一个无覆盖,减1
{
arr->pAddr[i] = arr->pAddr[i + 1];
}
arr->size--;
}
//根据值删除value第一次出现的位置
void RemoveByValue_Array(Dynamic_Array *arr, int value)
{
if (arr == NULL)
{
return;
}
//找到值的位置
int pos = Find_Array(arr, value);
//根据位置删除
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)
{
if (arr == NULL)
{
return;
}
for (int i = 0; i < arr->size; i++)
{
printf("%d ", arr->pAddr[i]);
}
printf("\n");
}
//释放动态数组的内存
void FreeSpace_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;
}
//pAddr->空间
arr->size = 0;
}
//获得动态数据容量
int Capacity_Array(Dynamic_Array *arr)
{
if (arr == 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)
{
return arr->pAddr[pos];
}
动态数组.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"DynamicArray.h"
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++)
{
Push_Back_Array(myArray, i);
}
//打印容量
printf("数组容量:%d\n", Capacity_Array(myArray));
printf("数组大小:%d\n", Size_Array(myArray));
//删除
RemoveByPOs_Array(myArray, 0);
RemoveByValue_Array(myArray, 27);
//打印
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;
}
/////////////////////////////运行结果////////////////////////////
/*
数组容量:20
数组大小:0
数组容量:40
数组大小:30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29
5查找到:pos:4 5
请按任意键继续. . .
*/
运行结果截图: