C实现可变数组

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;
}
发布了39 篇原创文章 · 获赞 4 · 访问量 5776

猜你喜欢

转载自blog.csdn.net/weixin_45725137/article/details/104121071