可变数组

设计一个Array库,提供数组初始化,数组数据查看和修改的功能,且数组大小可变。

array.h

/*
    可变数组 */

// array_block,每次触发自动增长时增长的数量,记作一个array_block
#define ARRAY_BLOCK 10

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

Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int array_get(const Array *a,int index);
void array_set(Array *a,int index,int value);
void array_inflate(Array *a,int add_size);

Array array_create(int init_size){
    // 初始化数组    
        Array a = {
        init_size,
        (int*)malloc(sizeof(int)*init_size)
    };
    return a;
}

void array_free(Array *a){
    // 释放数组    
    free(a->array);
    a->size = 0;
    a->array = NULL;
}

int array_size(const Array *a){
    // 读取数组的大小    
    return a->size;
}

int array_get(const Array *a,int index){
    // 读取数组中的成员的值    
    return a->array[index];
}

void array_set(Array *a,int index,int value){
    // 设置数组中成员的值    
    if(index >= a->size){
        // 越界自动增长        
        int over_size = (index+1) - a->size;
        int block_num = (over_size/ARRAY_BLOCK) + 1;
        int add_size = block_num * ARRAY_BLOCK;
        array_inflate(a,add_size);
    }
    // 设置值    
    a->array[index] = value;
}

void array_inflate(Array *a,int add_size){
    // 数组增长    
    int *t = (int*)malloc(sizeof(int)*(a->size+add_size));
    for(int i = 0; i < a->size; i++){
        t[i] = a->array[i];
    }
    free(a->array);
    a->array = t;
    a->size += add_size;
}

测试样例

main.c

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

int main(){
    Array arr = array_create(20);
    hr('-',60);
    for(int i = 1; i < 20; i++){
        array_set(&arr,i,i);
        printf("%d ",arr.array[i]);
    }
    printf("\b\n");
    printf("array.size => %d\n",array_size(&arr));
    hr('-',60);
    for(int i = 1; i < 25; i++){
        array_set(&arr,i,i);
        printf("%d ",arr.array[i]);
    }
    printf("\b\n");
    printf("array.size => %d\n",array_size(&arr));
    hr('-',60);

    return 0;
}

输出

------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
array.size => 20
------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
array.size => 30
------------------------------------------------------------

style.h

void hr(char ch,int num){
    for(int i = 0; i < num; i++){
        if(i!=num-1)
            printf("%c",ch);
        else
            printf("%c\n",ch);
    }
}
最后修改:2023 年 04 月 28 日
如果觉得我的文章对你有用,请随意赞赏