#include "resizable_array.h"
/*
typedef struct{
int *array;
int size;
}Array;
*/
const block_size=5;
Array array_create(int init_size){
Array a;
a.size=init_size;
a.array=(int *)malloc(a.size*sizeof(int));
return a;
}
void array_free(Array *a){
free(a->array);
a->array=0;
a->size=0;
}
//封装
int array_size(const Array *a){
return a->size;
}
//返回指针数字指定位置的指针
int *array_at(Array *a,int index){
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){
if(index>=a->size){
array_inflate(a,(index/block_size+1)*block_size-a->size);
}
a->array[index]=value;
}
//存在申请新内存,拷贝等问题,
//而且申请内存是接续的,一旦到内存尾,内存地址没办法加上 block_size,就不能加长数组,但明明前面的内存已经释放了。这个时候需要用到链表。
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;
}
void resizable_array1(void){
Array a;
a=array_create(6);
printf("%d\n",array_size(&a));
array_set(&a,0,10);
printf("%d\n", array_get(&a,0));
int number;
int cnt=0;
int i;
while(number != -1){
scanf("%d",&number);
array_set(&a,cnt++,number);
}
for(i=0;i<a.size;i++){
printf("%d ",a.array[i]);
}
array_free(&a);
}
C语言学习笔记—可变数组
最新推荐文章于 2024-01-30 12:58:31 发布