可增长数组
主要代码如下
#include"array.h"
#include<stdio.h>
#include<stdlib.h>
const int BLOCK_SIZE=20; //数组每次增长20个单元为一个单位
typedef struct //建立一个数组结构体
{
int *array; //数组的指针
int size; //数组长度
}Array;
void array_inflate(Array *a,int more_size) //增长数组的函数more_size为增长单元的数量
{
int *p=(int *)malloc(sizeof(int)*(a->size+more_size)); //建立一个增长后的数组空间p
int i;
for ( i = 0; i < a->size; i++) //将原有数组的内容复制到新的增长空间里
{
p[i]=a->array[i];
}
free(a->array); //释放原有数组的空间
a->array=p; //将数组a的指针指向p所指的新空间
a->size+=more_size; //数组a的长度更新
}
Array array_create(int init_size) //创建一个数组
{
Array a;
a.size=init_size;
a.array=(int *)malloc(a.size*sizeof(int));
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;
}
int *array_at(Array *a,int index) //给数组赋值同时实现增长
{
if (index>=a->size)
{
array_inflate(a,((index-a->size)/BLOCK_SIZE+1)*BLOCK_SIZE);
}
return &(a->array[index]);
}
int array_get(const Array *a,int index) //输出数组某个位置的值
{
return a->array[index];
}
void array_set(Array *a,int index,int value) //数组的赋值
{
a->array[index]=value;
}
函数array_inflate用来实现数组的增长;
首先用malloc建立一个新的空间,用指针p指向它;
通过for循环,将a数组的数据复制到p所指的数组中;
释放a数组的空间;
将a的指针指向p的空间;
更改a的长度。
void array_inflate(Array *a,int more_size) //增长数组的函数more_size为增长单元的数量
{
int *p=(int *)malloc(sizeof(int)*(a->size+more_size)); //建立一个增长后的数组空间p
int i;
for ( i = 0; i < a->size; i++) //将原有数组的内容复制到新的增长空间里
{
p[i]=a->array[i];
}
free(a->array); //释放原有数组的空间
a->array=p; //将数组a的指针指向p所指的新空间
a->size+=more_size; //数组a的长度更新
}
函数array_create用来创建新的数组,init_size为数组长度;
建立一个Array的结构体;
用malloc函数创建空间。
Array array_create(int init_size) //创建一个数组
{
Array a;
a.size=init_size;
a.array=(int *)malloc(a.size*sizeof(int));
return a;
}
函数array_free用来释放数组空间;
通过free函数释放数组空间;
再将a的指针和长度初始化为零。
void array_free(Array *a) //释放数组空间
{
free(a->array);
a->array=NULL;
a->size=0;
}
函数array_size用来返回数组的长度。
int array_size(const Array *a) //返回数组长度
{
return a->size;
}
函数arra_at用来给函数赋值,同时若发现赋值的位置超过原有创建的数组长度,则实现自动增长,index为需要赋值的数组地址;
先判断赋值的位置是否超过原有数组的长度,若超过则用array_inflate函数增长;
int *array_at(Array *a,int index) //给数组赋值同时实现增长
{
if (index>=a->size)
{
array_inflate(a,((index-a->size)/BLOCK_SIZE+1)*BLOCK_SIZE);
}
return &(a->array[index]);
}
函数array_get用来返回数组的值。
int array_get(const Array *a,int index) //输出数组某个位置的值
{
return a->array[index];
}
函数array_set用来给数组赋值。
void array_set(Array *a,int index,int value) //数组的赋值
{
a->array[index]=value;
}