1. 程式人生 > >5.1 自定義可變陣列

5.1 自定義可變陣列

1.array.h

#ifndef _ARRAY_H_
#define _ARRAY_H_

typedef struct {
    int *array;
    int size;
} Array;

Array array_create(int init_size);

void array_free(Array *a);

int array_size(const Array *a);

int* array_at(Array *a, int index);

//自動增長
const BLOCK_SIZE = 20; // 每次長度增加 20 
void array_inflate(Array *a, int
more_size); #endif

2.array.c

#include "array.h"
#include<stdio.h>

Array array_create(int init_size){
    Array a;
    a.size = init_size;
    a.array = (int*)malloc(sizeof(int) * a.size);
    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; } void array_inflate(Array *a, int more_size){ int *p = (int*)malloc(sizeof(int) * (a->size + more_size)); int i; for(i = 0; i < a->size; i++){ p[i] = a->array[i]; } free(a->array); a->array
= p; a->size += more_size; } int* array_at(Array *a, int index){ if(index >= a->size){ // array_inflate(a, index - a->size + 1); array_inflate(a, (index / BLOCK_SIZE + 1) * BLOCK_SIZE - a->size); } return &(a->array[index]); } int main(int argc, const char *argv){ Array a = array_create(2); printf("%d\n", array_size(&a)); // 2 *array_at(&a, 0) = 10; printf("%d\n", *array_at(&a, 0)); // 10 int number; int cnt; for(cnt = 1; cnt < 6; cnt++){ // scanf("%d", &number); // *array_at(&a, cnt) = number; // 輸入 3 4 5 6 7 scanf("%d", array_at(&a, cnt)); } printf("%d\n", *array_at(&a, 2)); // 4 array_free(&a); return 0; }