可变数组

 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\n", array_size(&a));
76     *array_at(&a, 0) = 10;
77     printf("%d\n", *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 }

 

posted @ 2017-05-10 19:35  TingShuo  阅读(656)  评论(0编辑  收藏  举报