C语言实现可变数组

#include <stdio.h>
#include <stdlib.h>

const int BLOCK_SIZE = 20;
//创建结构体 
typedef struct {
	int *array;
	int size;
} Array;

//函数声明 
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);

//函数 
//创建数组
Array array_create(int init_size){
	Array a;
	a.size = init_size;
	a.array = (int*)malloc(sizeof(int)*a.size);
	return a;
}
//释放内存
void array_free(Array *a){
	free(a->array);
	a->array = NULL;
	a->size = 0;
}
//封装,获取数组大小
int array_size(const Array *a){//*a 声明a是一个指针变量,传入参数的时候要用&传入地址 
	return a->size;
}
//查询数组下标对应值 
int* array_at(Array *a,int index){
	if (index >= a->size){
		array_inflate(a, (index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);
	}//如果下标超出数组长度,则把数组增大一个BLOCK 
	return &(a->array[index]);
}

/*
int array_get(const Array *a,int index){
	return a->array[index];
} 

void array_set(Array *a, int index, int value){
	a->array[index] = value;
}
*/
//增长数组 
void array_inflate(Array *a,int more_size){
	int *p = (int*)malloc(sizeof(int)*(a->size + more_size));
	int i;
	for (i=0; i<a->size; i++){
		p[i] = a->array[i];
	}
	free(a->array);
	a->array = p;
	a->size += more_size;
	
}


int main(int argc, char const *argv[] )
{
	Array a = array_create(10);
	printf("数组长度为:%d\n",array_size(&a));
	*array_at(&a,0) = 5;//写入值到数组 
	*array_at(&a,1) = 6;//写入值到数组 
	*array_at(&a,2) = 7;//写入值到数组 
	printf("第一位值为:%d\n",*array_at(&a,0)); 
	printf("第二位值为:%d\n",*array_at(&a,1)); 
	printf("第三位值为:%d\n",*array_at(&a,2)); 
//	int number = 0; 
//	int cnt = 0;
//	while (number !=-1){
//		scanf("%d", &number);
//		if (number != -1){
//			*array_at(&a,cnt++) = number;
//		}
//	} 
	
	array_free(&a);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41580631/article/details/87621502