动态数组
#define SUCESS 1
#define MISTAKE_1 1
#define MISTAKE_2 2
#define MISTAKE_3 3
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct dynamicArray{
void** pAddr;
int m_capacity;
int m_size;
}dy_array;
dy_array * init_dynamicArray(int capacity){
if (capacity<=0)
{
return NULL;
}
dy_array * array=malloc(sizeof (dy_array));
if (array == NULL){
return NULL;
}
array->pAddr = malloc(sizeof (void *)*capacity);
array->m_capacity= capacity;
array->m_size =0;
return array;
}
void insert_array(dy_array* array,void* data ,int pos){
if (array==NULL)
{
printf("%d",MISTAKE_1);
return;
}
if(data == NULL)
{
return;
}
if (pos<0 || pos>array->m_size)
{
printf("%d",MISTAKE_3);
pos = array->m_size;
}
if (array->m_size == array->m_capacity)
{
int new_capacity = array->m_capacity*2;
void** new_space = malloc(sizeof (void*)*new_capacity);
memcpy(new_space,array->pAddr,sizeof (void* )* array->m_capacity);
free(array->pAddr);
array->pAddr = new_space;
array->m_capacity = new_capacity;
}
for (int i = array->m_size-1; i >= pos; i--)
{
array->pAddr[i+1] = array->pAddr[i];
}
array->pAddr[pos] = data;
array->m_size++;
}
void foreach_DynamicArray(dy_array* array, void (*myPrint)(void *))
{
if (array == NULL)
{
return;
}
if (myPrint == NULL)
{
return;
}
for (int i = 0; i <array->m_size ; ++i)
{
myPrint(array->pAddr[i]);
}
}
typedef struct Person{
char name[64];
int age;
} Person;
void myPrintPerson(void *data){
Person *p =data;
printf("name :%s ,age :%d\n",p->name,p->age);
}
void removeBy_pos_DynamicArray(dy_array *array,int pos){
if (array == NULL)
{
printf("%d",MISTAKE_1);
return;
}
if (pos<0||pos>array->m_size-1)
{
return;
}
for (int i = pos; i <array->m_size-1 ; ++i) {
array->pAddr[i]=array->pAddr[i+1];
}
array->m_size--;
}
void removeBy_value_DynamicArray(dy_array*array,void *data,int (*myCompare)(void *,void *)){
if (array==NULL)
{
return;
}
if (NULL== data)
{
return;
}
for (int i = 0; i <array->m_size ; ++i) {
if (myCompare(array->pAddr[i],data))
{
removeBy_pos_DynamicArray(array,i);
}
}
}
int PersonCompare(void *data1,void *data2){
Person *p1 =data1;
Person *p2 =data2;
return strcmp(p1->name,p2->name)==0&& p1->age==p2->age;
}
void destory_DynamicArray(dy_array *array){
if (array ==NULL){
return;
}
if (array->pAddr!= NULL)
{
free(array->pAddr);
array->pAddr =NULL;
}
free(array);
array =NULL;
printf("释放成功!\n");
}
int main()
{
dy_array* array= init_dynamicArray(4);
printf("插入数据前size =%d,插入数据后capacity =%d\n",array->m_size,array->m_capacity);
Person P1 ={"ToM1", 18};
Person P2 ={"1ToM2", 18};
Person P3 ={"ToM3", 18};
Person P4={"ToM4", 18};
Person P5 ={"ToM5", 18};
Person P6={"ToM6", 1889};
insert_array(array,&P1,0);
insert_array(array,&P2,0);
insert_array(array,&P3,0);
insert_array(array,&P4,0);
insert_array(array,&P5,0);
insert_array(array,&P6,0);
foreach_DynamicArray(array,myPrintPerson);
printf("插入数据后size =%d,插入数据后capacity =%d\n",array->m_size,array->m_capacity);
removeBy_pos_DynamicArray(array,5);
foreach_DynamicArray(array,myPrintPerson);
printf("删除数据后size =%d,capacity =%d\n",array->m_size,array->m_capacity);
removeBy_value_DynamicArray(array,&P3,PersonCompare);
foreach_DynamicArray(array,myPrintPerson);
destory_DynamicArray(array);
return SUCESS;
}