【数据结构】C语言实现动态扩容数组

// resizable array


/*
Think about a set of functions that provide a mechanism of resizable array of int. 
    • Growable 
    • Get the current size 
    • Access to the elements
*/

/*
the Interface
    • Array array_create(int init_size); 
    • void array_free(Array *a); 
    • int array_size(const Array *a); 
    • int* array_at(Array *a, int index); 
    • void array_inflate(Array *a, int more_size);
*/
typedef struct 
{ 
    int* array; 
    int size; 
} Array;

#define BLOCK_SIZE 16

Array array_create(int init_size) 
{ 
    Array a; 
    a.array = (int*)malloc(sizeof(int) * init_size); 
    a.size = init_size; 
    return a; 
}

void array_free(Array *a) 
{ 
    free(a->array); 
    a->size = 0; 
}

int array_size(const Array *a) 
{ 
    return a->size; 
}

void array_inflate(Array *a, int more_size) 
{ 
    int* p = (int*)malloc(sizeof(int) * (a->size + more_size)); 
    for ( int i=0; i<a->size; i++ ) 
    {
        p[i] = a->array[i]; 
    }
    free(a->array); 
    a->array = p;
    a->size = a->size + more_size; 
}

void array_inflate(Array *a, int more_size) 
{
    int* p = (int*)malloc(sizeof(int) * (a->size + more_size)); 
    memcpy((void*) p, (void*) a->array, a->size*sizeof(int)); 
    free(a->array); 
    a->array = p; a->size = a->size+more_size; 
}


int* array_at(Array *a, int index) 
{ 
    if ( index >= a->size ) 
    { 
        array_inflate(a, 
            (index/BLOCK_SIZE+1) * BLOCK_SIZE-a->size); 
    } 
    return &(a->array[index]); 
}


int test()
{
    // use array_at()
    Array a = array_create(10); 
    *(array_at(&a, 5)) = 6; 
    *(array_at(&a, 10)) = *(array_at(&a, 5));
}

/*
will it be better
    • to have two access functions: 
    • array_get(), and 
    • array_set()

Array a = array_create(10); 
array_set(&a, 5, 6); 
array_set(&a, 10, array_get(&a, 5));
*/

未完待续,后续补充链式分块扩容数组(二维数组),以及C++ Vector实现

参考:C语言进阶- 浙江大学Mooc

posted @   LeonYi  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示