结构可变数组

/*开拓空间*/
Array array_create(int init_size)
{
    Array a;
    a.size = init_size;
    a.array=(int *)malloc(sizeof(int)*a.size);                  //分配地址因为Array.array就是指针类型
    return a;
}

该段代码用malloc来为结构体里面的数组指针分配一个我们需要的空间,然后把地址分配给结构体里面的array
为Array结构体分配一个空间并返回一个Array类型
用于主函数里面Array结构体类型直接复制;

/*恢复空间,清空内存*/
void array_free(Array *a) {             
    free(a->array);                                                         //清空内存
    a->array = NULL;                                                        //不为array分配内存
    a->size = 0;                                                                //size置0
}

运用free函数清空array指针占用的内存,并且把地址改为NULL,和size置为0;我们一般用这个结构体里面的size表示数组大小

/*封装为了后期升级*/
int array_size(const Array *a) {        
    return a->size;                                                         //得出数组的size
}

我们使用直接读取结构体的size获取数组使用了多少;当然我们也可以用a->array++的方式来判断是否为’\0’判断;

/*返回在index上的指针.为了后期给当前数组写入数值*/
/*如*array_at(&a,0)=10,把a->array[0]=10*/
int* array_at(Array *a, int index)
 {
    if (index >= a->size) {
        array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);//思路,判断index处在哪个区间内,乘上20-当前的每次就增长20
    }
    return &(a ->array[index]);
}

返回结构体a->array[index]的指针,便于对a->array的值进行修改
在里面做了一个判断空间是否足够的条件如果不够的话则继续进行增长
每次增长都为BLOCK_SIZE的整数倍,(index/BLOCK_SIZE+1)BLOCK_SIZE-a->size)先求出传进来的index在那个区间区间大小得到该区间的最大值减去当前的a->size得到要增长的空间。

/*增长空间*/
void array_inflate(Array *a, int more_size) {
    int *p;
    p=(int*)malloc(sizeof(a->size + more_size));//分配新的空间
    int i;
    /*复制当前a.array的值到P指针里面*/
    for (i = 0; i < a->size; i++) {
        p[i] = a->array[i];
    }
/*释放空间*/
    free(a->array);
/*把a.array指向分配的空间*/
    a->array = p;
    a->size += more_size;
}

结构数组大小变换,增长空间。主要是利用把现在的指针数组a->array的地址指向一个新分配的空间。

int main()
{
    Array a = array_create(100);
    int cnt = 0;
    int number=0;
    while (number!=-1)
    {
        scanf("%d", &number);
        if (number != -1) *array_at(&a, cnt++) = number;
    }
    for (int i = 0; i < cnt; i++) {
        printf("%d",a.array[i]);
    }
    while (1);
    return 0;
}

引用网易云课堂《C语言程序设计进阶》–翁恺 5.1-3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值