1 // 可变数组
2
3 #include <stdio.h>
4 #include <malloc.h>
5
6 int const BLOCK_SIZE = 20;
7
8 typedef struct {
9 int *array;
10 int size;
11 } Array;
12
13 Array array_create(int init_size);
14 void array_free(Array *a);
15 int array_size(const Array *a);
16 int* array_at(Array *a, int index);
17 void array_inflate(Array *a, int more_size);
18
19 // 创建数组
20 Array array_create(int init_size)
21 {
22 Array a;
23 // 数组的长度
24 a.size = init_size;
25 // 根据长度, 创建数组
26 a.array = (int*)malloc(sizeof(int)*a.size);
27
28 return a;
29 }
30
31 // 回收数组空间
32 void array_free(Array *a)
33 {
34 free(a->array);
35 // 防止二次调用,free(0), free(NULL) 是无害的
36 a->array = NULL;
37 a->size = 0;
38 }
39
40 // 返回数组可用单元
41 int array_size(const Array *a)
42 {
43 return a->size;
44 }
45
46 // 返回数组下标的地址
47 int* array_at(Array *a, int index)
48 {
49 // 如果给出的下标大于数组长度, 就增长数组
50 if (index >= a->size){
51 array_inflate(a, (index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);
52 }
53 return &(a->array[index]);
54 }
55
56 // 增长数组, 程序和核心部分
57 void array_inflate(Array *a, int more_size)
58 {
59 // 申请更大的新空间
60 int *p = (int *)malloc(sizeof(int)*(a->size + more_size));
61 int i;
62 // 将数组元素迁移到新空间
63 for (i=0; i<a->size; i++) {
64 p[i] = a->array[i];
65 }
66 // 回收原来旧空间
67 free(a->array);
68 a->array = p;
69 a->size += more_size;
70 }
71
72 int main(int argc, char const *argv[])
73 {
74 Array a = array_create(100);
75 printf("%d
", array_size(&a));
76 *array_at(&a, 0) = 10;
77 printf("%d
", *array_at(&a, 0));
78 int number;
79 int cnt = 0;
80 while (number != -1){
81 scanf("%d", &number);
82 if (number != -1){
83 *array_at(&a, cnt) = number;
84 cnt ++;
85 }
86 }
87 array_free(&a);
88
89 return 0;
90 }