可变数组

138 阅读1分钟

可变数组

const BLOCK_SIZE=20;
typedef struct {
    int *array;
    int size;
}Array;

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);//或者写成free((*a).array);
    a->array=NULL;//或者写成(*a).array=NULL;
    a->size=0;//或者写成(*a).size=0;
}

//封装
int array_size(const Array *a){
    return a->size;//或者写成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);
    }
    return &(a->array[index]);
}

//核心函数,使数组增长
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(){
    Array a=array_create(100);
    printf("%d\n",array_size(&a));
    *array_at(&a,0)=10;
    printf("%d\n",*array_at(&a,0));
    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;
}