【数据结构】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 @ 2023-05-04 23:51  LeonYi  阅读(44)  评论(0编辑  收藏  举报