一.将元素按指定位置插入数组的功能
二.遍历数组的功能
三.删除数组中元素的功能
1.按指定位置删除数组元素
2.按指定的值删除数组元素
四.销毁数组的功能
contach.h(头文件)
#include<stdio.h>
include<string.h>
#include<stdlib.h>
//动态数组结构体
struct dynamicArray
{
void ** pAddr;//维护在堆区真实数组指针
int m_capacity;//数组容量
int m_size;//数组大小
}
//初始化数组
struct dynamicArray *init_DynamiArray(int capacity);
//一.插入功能
void intsert_dnamicArray(struct dynamicArray * array,int pos,void*data);
//二.遍历数组功能
void foreach_DynamicArray(struct dynamicArray * array,void(*myForeach)(void*));
//三.1删除数组中的元素--按照位置来删除
void removeByPos_DynamicArray(struct dynamicAray* arr,int pos);
//三.2删除数组中的元素--按照值来删除
void remocebByValue_DynamicArray(struct dynamicArray* arr, void*data,int(*myCompare);
//四.销毁数组
void destroy_DynamicArray(struct dynamicArray * arr);
test.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"contact.h"
struct Person
{
char name[64];
int age;
};
void myPrintPerson(void *data)
{
structPerson * p=data;
printf("姓名:%s 年龄:%d\n",p->name, p->age);
}
int myComparePerson(void *data1,void *data2)
{
struct Person* p1 =data1;
struct Person* p2 =data2;
return strcmp(p1->name,p2->name)==0 &&p1->age == p2 ->age;
}
void tset01()
{
//创建动态数组
struct dynamicArray*arr=struct init_DynamicArray(5);
//准备5个person数据
struct Person p1={"亚索",18};
struct Person p2={"瑞文",19};
struct Person p3={"鳄鱼",20};
struct Person p4={"诺手",21};
struct Person p5={"卡兹克",22};
struct Person p6={“狮子狗",23};
//将数据插入到动态数组中
printf("当前容量为:%d\n",arr->m_capacity);
insert_dynamicArray{arr,0,&p1};
insert_dynamicArray{arr,1,&p2};
insert_dynamicArray{arr,2,&p3};
insert_dynamicArray{arr,3,&p4};
insert_dynamicArray{arr,4,&p5};
insert_dynamicArray{arr,100,&p6};
// 亚索 瑞文 鳄鱼 诺手 卡兹克
//遍历动态数组
foreach_DynamicArray(arr,myPrintPerson);
printf("插入数据后容量为:%d\n", arr->m_capacity);
//删除数组中的元素
remoceByPos_DynamicArray(arr,1)
printf("删除第一个位置的元素后,数组中的数据为:\n");
foreach_DynamicArray(arr,myPrintPerson);
struct Person p={"瑞文",19};
removeByValue_DynamicArray(arr,&p2,myComparePerson);
foreach_DynamicArray(arr,myPrintPerson);
//销毁数组
destroy_DynamicArray(arr);
arr=NULL;
}
int main()
{
tset01();
system("pause")
return EXIT_SUCCESS;
}
contact.c
#include<stdio.h>
include<string.h>
#include<stdlib.h>
#include"contact.h"
//初始化数组
struct dynamicArray *init_DynamiArray(int capacity)
{
if(capacity<=0)
{
return NULL;
}
struct dynamicArray *array =malloc(sizeof(struct dynamicArray));
//判断内存是否申请成功
if(NULL == array)
{
return NULL;
}
//设置容量
array->m_capacity=capacity;
//设置大小
array->m_size=0;
//维护在堆区数组的指针
array->pAddr=malloc(sizeof(void*)*array->m_capacity);
return array;
}
//一.插入功能
void intsert_dnamicArray(struct dynamicArray * array,int pos,void*data)
{
if(NULL==array)
{
return ;
}
if(NULL == data)
{
return ;
}
if(pos<0 || pos>m_size)
{
//无效位置或进行尾插
pos=array->m_size;
}
//先判断是否已 满载,如果满载了就先动态开辟
if(array->m_size>=array->m_capacity)
{
//1.申请一更大的内存空间
int newCapacity=array->m_capacity*2;
//2.创建新空间
void**newSpace=malloc(sizeof(void*)*newCapacity);
3.将原有的数据拷贝到新空间里
memcpy(newSpace,array->pAddr,sizeof(void*)*array->m_capacity);
//4.释放原有空间
free(array->pAddr);
//5.更改指针指向
array->m_capacity=newSpace;
//6.更新新容量大小;
array->m_capacity=newCapacity;
}
//插入新的数据元素
//从最后一个位置开始依次移动数据 后移
for(int i=array->m_size-1;i>=pos;i--)
{
array->pAddr[i+1]=array->pAddr[i];
}
//将新元素插入指定位置
array->pAddr[pos]=data;
//更新大小
array->size++;
}
//二.遍历数组功能
void foreach_DynamicArray(struct dynamicArray * array,void(*myForeach)(void*))
{
if(NULL == array )
{
return ;
}
if(NULL ==myForeach )
{
return ;
}
for(int i=0;i<array->m_size;i++)
{
myForeach(array->pAddr[i])
}
}
//三.1删除数组中的元素--按照位置来删除
void removeByPos_DynamicArray(struct dynamicAray* arr,int pos)
{
if(NULL= arr)
{
return ;
}
if(pos<0 || pos>arr->m-size-1)
{
//无效数据 直接return
return ;
}
//pos位置开始到数组尾 数据进行前移
for(int i=pos;i<arr->m_size-1;i++)
{
arr->pAddr[i]=arr->pAddr[i+1];
}
arr->m_size--;
}
//三.2删除数组中的元素--按照值来删除
void remocebByValue_DynamicArray(struct dynamicArray* arr, void*data,int(*myCompare)(void*,void*))
{
if(NULL== arr)
{
return ;
}
if(NULL == data )
{
return ;
}
for(int i=0;i<arr->m_size;i++)
{
if(myConpare(arr->pAddr[i],data))
{
removeByPos_DynamicArray(arr,i);
break;
}
}
}
//四.销毁数组
void destroy_DynamicArray(struct dynamicArray * arr)
{
if(NULL == arr)
{
return ;
}
if(arr->pAddr!=NULL)
{
free(arr->pAddr);
arr->pAddr=NULL;
}
free(arr);
arr=NULL;
}
|