C语言—数据结构—动态数组

动态数组

//
// 动态数组,代码注释简单明了
//
#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){
//    printf("%d",MISTAKE_3);
    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; //pos指向尾部的位置

    }
    // 如果数据满了是否可以进行动态扩展
    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;
    //size加一个
    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]);
        
    }
}

// TEST
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--;


}

// 按照值来删除数据
//int (*myCompare)(void *,void *))为比较函数返回值为ture or False,找出删除位置
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))
        {
            //返回值为True则i就是删除的位置
            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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

toptap8_nn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值