zoukankan      html  css  js  c++  java
  • 可变数组

     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 }
  • 相关阅读:
    list extend 和 append
    构建同元素的列表
    Python拷贝(深拷贝deepcopy与浅拷贝copy)
    MySQL之对数据库库表的字符集的更改
    Shell之while循环
    安装keepalived
    Zabbix监控MySQL
    Ganglia监控MySQL
    将Nagios监控信息存入Mysql
    Hadoop之回收站
  • 原文地址:https://www.cnblogs.com/tingshuo123/p/6837717.html
Copyright © 2011-2022 走看看