c语言自定义函数实现数组大小可自增

首先定义一个结构体

typedef struct {
	int* array;//数组空间
	int size;  //数组大小
}Array;
该结构体不定义为指针原因(传指针省空间):
1.定义为指针后,就无法定义本地变量,一定是在某处另开一处空间,然后指针指向那里。
2.定义变量时不容易看出是指针。

该数组须实现以下功能:
1.创建数组array_creat
2.释放数组内存array_free
3.返回数组大小array_size
4.访问数组的某个位置array_at
5.空间不足时自增array_inflate
对应5个函数,下面分别实现:

1.数组创建函数 Array array_creat(int init_size);

Array array_creat (int init_size){
	Array a;
	a.size = init_size;
	a.array = (int*)malloc(sizeof(int)*a.size);
	return a;
}

为什么Array* array_creat(Array* a, int init_size)不行?
1.传进的指针可能指向NULL,a->array == NULL;
2.指针可能指向一个有效数组,需先free()
故自定义一个本地变量,赋值后,传出。

2.释放内存函数void array_free( Array* a );

void array_free ( Array* a ){
	free( a->array );
	a->array = NULL;
	a->size = 0;          //保险起见
}

3.返回数组大小函数 int array_size (Arrray* a);

int array_size ( Array* a ){
	return a->size;
}
封装,如需升级程序,方便改动。

4.访问数组函数 int* array_at (Array* a, int index );

int* array_at ( Array *a, int index ){
	return &( a->array[index] );
}

为什么返回指针?
既然是访问数组,就要可读可写,可右值可左值
返回指针后,即可通过指针对数组某位读写
读数组第0位:printf("%d",*array_at(&a, 0);
写数组第0位:*array_at(&a, 0) = 10;

注意:参数是&a.要的是地址,a是本地变量,故是&a.

5.自增函数void array_inflate(Array* a, moresize)

void array_infiate( Array* a, 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数组
	a->size += moresize;
}

此时的数组访问函数array_at需要修改:当访问数组越界时,调用array_inflate函数

int* array_at ( Array *a, int index ){ //参数index为数组增加大小,一个BLOCK如下
	if( index>a->size ){
		array_inflate(a,(a->size/BLOCK+1)*BLOCK-a->size );
	}
	return &( a->array[index] );
}

测试主函数

int main(int argc, char *argv[]) {
	Array a;
	a = array_creat(3);
	printf("数组大小为:%d\n",array_size(&a)) ;
	*array_at(&a,0) = 1;               //访问数组0位置赋值
	printf("数组0位置为:%d\n", *array_at(&a,0) );//访问数组0位置读值
	int number;
	int cnt = 0;//计数器,也是数组的位
	while( number != -1 ){//不断输入,等于-1时停止,测试自增功能
		scanf("%d",&number);
		if( number != -1 )
			*array_at( &a, cnt++) = number;
	}
	return 0;
}

如有错误,欢迎指正。

你可能感兴趣的:(数据结构,数据结构)