C实现可变数组
参考 浙江大学 C语言程序设计 2020最新 C语言程序设计进阶 浙江大学.翁恺老师
用一个.h文件定义函数和结构体,一个.c文件实现函数
使用
实现
结构体
typedef struct
{
int* array; //数组头指针
int size; //数组大小
}Array;
创建数组
Array array_create( int init_size); //创建数组
Array array_create( int init_size) //创建数组
{
Array a;
a.array = (int*)malloc(sizeof(int) * init_size);
a.size = init_size;
return a;
}
free掉数组
void array_free( Array* a); //free掉这个数组
void array_free( Array* a) //free掉这个数组
{
free(a -> array);
a->array = NULL;
a->size = 0;
}
这里核心代码只有这一句
free(a->array);
也就是说最简单的实现方式是
void array_free( Array* a); //free掉这个数组
void array_free( Array* a) //free掉这个数组
{
free(a->array);
}
但是为了避免这个free函数被重复调用时产生不良后果,让这个指针指向NULL
c中free掉NULL不会有不良影响
所以加入这句代码
a->array = NULL;
从意义上来讲,free掉了这个数组,那么这个数组大小应为0
故有
a->size = 0;
获取数组大小
int array_size( const Array* a); //获取这个数组的大小
int array_size( const Array* a) //获取这个数组的大小
{
return a->size;
}
获取某个元素(指针)
int* array_get( Array* a, int Index); //获取某个元素
int* array_get( Array* a, int Index) //获取某个元素
{
return &(a->array[Index]);
}
指针是为了可实现修改
修改某个元素
void array_set( Array* a, int val, int Index); //修改某个元素的值
void array_set( Array* a, int val, int Index)//修改某个元素的值
{
(a->array)[Index] = val;
}
这里可以加入对val的限制
核心:让数组变长的函数
void array_inflate(Array* a,int more_size); //核心:让数组变长的函数
void array_inflate(Array* a,int more_size) //核心:让数组变长的函数
{
int i;
int* p = (int*)malloc(sizeof(int) * ( (a -> size) + more_size) );
for(i = 0;i < a->size;i++)
{
p [i] = (a -> array)[i];
}
free(a -> array);
a -> array = p;
a -> size += more_size;
}
全家福
头文件
#ifndef ARRAY
#define ARRAY
/*
* 目的:实现一个可变大小的数组
*/
typedef struct
{
int* array; //数组头指针
int size; //数组大小
}Array;
Array array_create( int init_size); //创建数组
void array_free( Array* a); //free掉这个数组
int array_size( const Array* a); //获取这个数组的大小
int* array_get( Array* a, int Index); //获取某个元素的指针(指针是为了方便修改)
void array_set( Array* a, int Index, int val); //修改某个元素的值
void array_inflate(Array* a,int more_size); //核心:让数组变长的函数
#endif
函数实现
#include <stdio.h>
#include <stdlib.h>
#include "array.h"
Array array_create( int init_size) //创建数组
{
Array a;
a.array = (int*)malloc(sizeof(int) * init_size);
a.size = init_size;
return a;
}
void array_free( Array* a) //free掉这个数组
{
free(a -> array);
a->array = NULL;
a->size = 0;
}
int array_size( const Array* a) //获取这个数组的大小
{
return a->size;
}
int* array_get( Array* a, int Index) //获取某个元素的指针(指针是为了方便修改)
{
return &(a->array[Index]);
}
void array_set( Array* a, int Index, int val)//修改某个元素的值
{
(a -> array)[Index] = val;
}
void array_inflate(Array* a,int more_size) //核心:让数组变长的函数
{
int i;
int* p = (int*)malloc(sizeof(int) * ( (a -> size) + more_size) );
for(i = 0;i < a->size;i++)
{
p [i] = (a -> array)[i];
}
free(a -> array);
a -> array = p;
a -> size += more_size;
}
搭配的main函数
#include <stdio.h>
#include <stdlib.h>
#include "array.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
Array a = array_create(10);
printf("数组大小为:%d\n",array_size(&a));
int i;
for(i = 0;i < array_size(&a); i++)
{
array_set(&a,i,i + 1);
}
for(i = 0;i < array_size(&a); i++)
{
printf("第%d位为: %d\n",i,*array_get(&a,i));
}
printf("\n\n");
array_inflate(&a,13);
for(i = 0;i < array_size(&a); i++)
{
printf("第%d位为: %d\n",i,*array_get(&a,i));
}
array_free(&a);
return 0;
}