可变数组——链表前言

可变数组,即数组所占空间大小可变的数组。对于刚刚学完数组,还未涉入链表的小萌新(比如我)来说,在解决一些题目时,常常会遇到数组内有效数据个数未知的情况。通常,我们会建立一个满足题目条件的足够大的数组,但是这样的做法往往会浪费许多空间。至此,可变数组的出现就应运而生了。下面,我们可以尝试几个关于可变数组的函数。

创建新数组
typedef struct
{
    int *array;
    int size;
} array;
//创建新数组
array a_create(int initsize)
{
    array a;
    a.size = initsize;
    a.array = (int *)malloc(sizeof(int *)*a.size);
    return a;
}
回收数组空间
//回收数组空间
void a_free(array *a)
{
    free(a->array);
    a->size =0;
    a->array = NULL;
}
查看数组大小
//查看数组大小
int a_size(const array *a)
{
    return a->size;
}
数组增长
//数组增长
void a_inflate(array *a,int moresize)
{
    int *p = (int *)malloc(sizeof(int)*(a->size + moresize));
    for(int i=0; i < a->size; i++)
    {
        p[i] = a->array[i];
    }
    free(a->array);
    a->array = p;
    a->size += moresize;
}
访问数组中某个单元
//访问数组中某个单元
int *a_at(array *a, int index)
{
    if(index >= a->size)
    {
        a_inflate(a, ((index/blocksize+1)*blocksize - a->size));
    }
    return &(a->array[index]);
}

测试一下上述功能

#include <stdio.h>
#include <stdlib.h>

#define blocksize 20

typedef struct
{
    int *array;
    int size;
} array;
//创建新数组
array a_create(int initsize)
{
    array a;
    a.size = initsize;
    a.array = (int *)malloc(sizeof(int *)*a.size);
    return a;
}
//回收数组空间
void a_free(array *a)
{
    free(a->array);
    a->size =0;
    a->array = NULL;
}
//查看数组大小
int a_size(const array *a)
{
    return a->size;
}
//数组增长
void a_inflate(array *a,int moresize)
{
    int *p = (int *)malloc(sizeof(int)*(a->size + moresize));
    for(int i=0; i < a->size; i++)
    {
        p[i] = a->array[i];
    }
    free(a->array);
    a->array = p;
    a->size += moresize;
}
//访问数组中某个单元
int *a_at(array *a, int index)
{
    if(index >= a->size)
    {
        a_inflate(a, ((index/blocksize+1)*blocksize - a->size));
    }
    return &(a->array[index]);
}

int main(int argc, char const *argv[])
{
    array a = a_create(100);
    printf("%d\n",a_size(&a));
    *a_at(&a,0) = 10;
    printf("%d\n",*a_at(&a,0));
    int number;
    int cnt = 0;
    while(1)
    {
        scanf("%d", &number);
        if(number==-1) break;
        *a_at(&a,cnt++) = number;
    }
    for(int i=0;i<cnt;i++)
    {
        printf("%d ",*a_at(&a,i));
    }
    a_free(&a);
    return 0;
}

运行一下,我们在终端中得到了数组大小100,数组0号位元素为10
在这里插入图片描述
再输入1 2 3 4 5 6 7 8 9 -1,终端中输出了数组中各个元素
在这里插入图片描述
至此,可变数组的基本框架建立完毕了。
可变数组看似完美,但有一个缺陷:它需要整块的内存空间,以首地址的指针来访问每个单元。当没有整块内存的时候(或者说可用内存支离破碎),我们应该怎么办呢?
我们可以寻找一些可用内存,其内存大小能放下单个数组单元,再将这些数组单元的地址像链条一样关联起来,满足知道其中一个单元的地址即可找到所有单元的地址,并进行访问。
当我们要处理的元素不限于数字,而是一些数据,我们就可以通过这种方式把这些数据关联起来。这样的数据储存结构,就叫做链表。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值