C实现可增长数组

可增长数组

主要代码如下

#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;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值