可变数组实现
怎么样实现一个大小可变的数组?(只考虑输入正常的情况,暂不考虑越界等问题)
- 数组可以增长
- 能够方便的得到数组的大小
- 能够访问数组中的单元
需要实现的函数:
- Array array_create(int init_size);//创建一个初始大小为init_size的int类型数组
- void array_free(Array *a);//释放数组
- int array_size(const Array *a);//获得数组此时的大小
- int array_get(const Array *a , int index);//访问数组的第index个单元
- void array_set(Array *a , int index , int value);//设置数组的第index个单元
- void array_inflate(Array *a,int more_size);//给数组增加more_size个单元
实现代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct{ int *array; int size; }Array; Array array_create(int init_size);//创建一个初始大小为init_size的int类型数组 void array_free(Array *a);//释放数组 int array_size(const Array *a);//获得数组此时的大小 int array_get(const Array *a , int index);//访问数组的第index个单元 void array_set(Array *a , int index , int value);//设置数组的第index个单元 void array_inflate(Array *a,int more_size);//给数组增加more_size个单元 Array array_create(int init_size)//创建一个初始大小为init_size的int类型数组 { 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 = NULL; a->size = 0; } int array_size(const Array *a)//获得数组此时的大小 { return a->size; } int array_get(Array *a,int index)//访问数组的第index个单元 { return a->array[index]; } void array_set(Array *a,int index ,int value)//设置数组的第index个单元 { if(index >= a->size){ array_inflate(a,(index/20+1)*20 - a->size); } a->array[index] = value; } void array_inflate(Array *a,int more_size)//给数组增加more_size个单元 { int *p = (int*)malloc((a->size+more_size)*sizeof(int)); for(int i = 0; i<a->size ;i++){ p[i] = a->array[i]; } free(a->array); a->size =a->size+more_size; a->array = p; } int main(){ Array a = array_create(1); array_set(&a,0,1); printf("array_get(&a,0)=%d\n",array_get(&a,0)); printf("array_size(&a)=%d\n",array_size(&a)); array_set(&a,1,10); printf("array_size(&a)=%d\n",array_size(&a)); printf("array_get(&a,0)=%d\n",array_get(&a,0)); printf("array_get(&a,1)=%d\n",array_get(&a,1)); }