【数据结构】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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix