void *
|
void *
|
void *
|
void *
|
void *
|
比如我们的元素个数是5个,我们用一个地址保存这五个元素的地址,因此我们还需要一个元素void **pAddr
struct dynamic_array{
void** pAddr;
int m_capacity;
int m_size;
1. 初始化
初始化数组的时候,我们需要给一个默认的最大容量,也就是m_capacity,我们的返回值就是我们的结构体数组,所以我们的方法定义为:
struct dynamic_array * init_array(int capacity){
if(capacity <= 0){
return NULL;
return NULL;
接着我们需要开辟需要的内存,设置默认值
struct dynamic_array * init_array(int capacity){
if(capacity <= 0){
return NULL;
struct dynamic_array *array = malloc(sizeof(struct dynamic_array));
if(array == NULL){
return NULL;
void **pAddr = malloc(sizeof(void *) * capacity);
if(pAddr == NULL){
return NULL;
array->pAddr = pAddr;
array->m_capacity = capacity;
array->m_size = 0;
return array;
2.插入操作
我们根据给定的数组,在指定位置插入数据
插入数据之前,需要做简单的判断
void insert_array(struct dynamic_array *array, int pos){
if(array == NULL){
return;
if(pos < 0 || pos > array->m_size){
return;
如果当前的m_size和做最大容量一样大的时候,就需要考虑扩容了
if(array->m_size == array->m_capacity){
int new_capacity = array->m_capacity * 2;
void **new_pAddr = malloc(sizeof(void *) * new_capacity);
memcpy(new_pAddr, array->pAddr, sizeof(void *) * array->m_capacity);
free(array->pAddr);
array->m_capacity = new_capacity;
array->pAddr = new_pAddr;
array->m_size += 1;
不管有没有扩容,新的数据插入数组,插入的位置之后的数据的值都往后移一位,插入的data直接给到指定的位置
for(int i = array->m_size - 1;i > pos;i--){
array->pAddr[i+1] = array->pAddr[i];
array->pAddr[pos] = data;
完整的插入代码如下:
void insert_array(struct dynamic_array *array, int pos, void *data){
if(array == NULL){
return;
if(data == NULL){
return;
if(pos < 0 || pos > array->m_size){
return;
if(array->m_size == array->m_capacity){
int new_capacity = array->m_capacity * 2;
void **new_pAddr = malloc(sizeof(void *) * new_capacity);
memcpy(new_pAddr, array->pAddr, sizeof(void *) * array->m_capacity);
free(array->pAddr);
array->m_capacity = new_capacity;
array->pAddr = new_pAddr;
array->m_size += 1;
for(int i = array->m_size - 1;i > pos;i--){
array->pAddr[i+1] = array->pAddr[i];
array->pAddr[pos] = data;
3.新增元素
这个就比较简单了,直接插入到数据尾部就可以
void add_array(struct dynamic_array *array, void *data){
if(array == NULL){
return;
if(data == NULL){
return;
insert_array(array, array->m_size, data);
4.修改元素
直接在指定位置替换就可以了
void update_array(struct dynamic_array *array, int pos, void *data){
if(array == NULL){
return;
if(data == NULL){
return;
if(pos < 0 || pos >= array->m_size){
return;
array->pAddr[pos] = data;
5.删除元素
删除元素比较特殊一点,如果指定位置删除了,后面的元素需要往前补,同样的m_size也需要-1.
代码如下:
void delete_array(struct dynamic_array *array, int pos){
if(array == NULL){
return;
if(pos < 0 || pos >= array->m_size){
return;
if(pos == array->m_size - 1){
array->pAddr[pos] = NULL;
}else{
for(int i=pos;i< array->m_size - 1;i++){
array->pAddr[i] = array->pAddr[i+1];
array->m_size -= 1;
6.查询元素
我们根据指定位置,查询到具体的值,代码如下:
void * search_array(struct dynamic_array *array, int pos){
if(array == NULL){
return NULL;
if(pos < 0 || pos >= array->m_size){
return NULL;
return array->pAddr[pos];
到这里我们已经实现了一个数组的基本的增删改查功能,接下来我们测试一下
struct dynamic_array *array = init_array(2);
add_array(array, (void *)1);
add_array(array, (void *)10);
add_array(array, (void *)100);
update_array(array, 1, (void *)200);
delete_array(array, 1);
delete_array(array, 1);
int num = (int)array->pAddr[0];
通过检测,发现基本功能都是正常的,整体的思路是没问题的。