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 }
  • 相关阅读:
    zookeeper 集群安装(单点与分布式成功安装)
    ubuntu下tty1tty5命令控制台无法登录
    (1)《QT+OpenGL学习之我见》初始化窗口及三个重要函数 vs+Qt
    完全免费和开源的权限管理系统
    系统在iis6上部署
    代码生成那点事
    大整数乘法计算
    对字符串和字符数组的理解
    不被严格文档类型支持的元素
    Java实现一个简单的聊天小程序
  • 原文地址:https://www.cnblogs.com/tingshuo123/p/6837717.html
Copyright © 2011-2022 走看看