动态数组.

一.将元素按指定位置插入数组的功能

二.遍历数组的功能

三.删除数组中元素的功能

1.按指定位置删除数组元素

2.按指定的值删除数组元素

四.销毁数组的功能

dynamicArray.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;
}

dynamicArray.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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值