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
请按任意键继续. . .
*/
运行结果截图: