动态数组的创建方式

C语言动态数组的创建代码:
需要用户设定数组的元素数据类型,并提供供元素的打印函数给遍历函数作为参数回调

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>

struct DynamicArray
{
	//数据存储空间的首地址
	void** addr;
	//存储数据的内存中最大能够容纳多少元素
	int capacity;
	//当前存储数据的内存中有多少元素
	int size;
};
//初始化元素
void initDynamicArr(struct DynamicArray **p,int capacity)
{
	if (capacity<=0)
	{
		return NULL;
	}
	struct DynamicArray* m = malloc(sizeof(struct DynamicArray));
	if (m==NULL)
	{
		return NULL;
	}
	m->capacity = capacity;
	m->addr = malloc(sizeof(void *)*m->capacity);
	m->size = 0;
	*p = m;
}
//插入数组
void insert(struct DynamicArray *arr,int pos,void *data)
{
	if (arr==NULL)
	{
		return;
	}
	//如果插入的位置不合理,则在末尾插入
	if (pos>arr->size || pos<0)
	{
		pos = arr->size;
	}

	
	//判断空间是否足够
	if (arr->size >= arr->capacity)
	{
		//申请一块更大的空间
		int newcapacity = arr->capacity * 2;
		void** newspace = malloc(sizeof(void *)*newcapacity);
		//将原空间的数据拷贝过去
		memcpy(newspace,arr->addr,sizeof(void*)*arr->size);
		//释放原空间的内存
		free(arr->addr);
		//更新addr指向和capacity的值
		arr->addr = newspace;
		arr->capacity = newcapacity;
	}
	
	//移动元素,给pos位置空出位置来
	for (int i = arr->size-1; i >= pos; --i)
	{
		//printf("%d\n",arr->size);
		arr->addr[i + 1] = arr->addr[i];
		//getchar();
	}

	//将新元素插入
	arr->addr[pos] = data;
	//更新size值
	arr->size = arr->size + 1;

}
//遍历
void foreach(struct DynamicArray* arr, void(*_callback)(void*))
{
	if (arr==NULL)
	{
		return;
	}
	if (_callback==NULL)
	{
		return;
	}
	for (int i = 0; i < arr->size; i++)
	{
		_callback(arr->addr[i]);

	}
}
//由用户定义的数据类型
struct Person
{
	char name[64];
	int age;
};
//由用户定义的打印函数
void userprint(void *data)
{
	struct Person* p = (struct Person *)data;
	printf("名字是:%s,年龄是:%d\n", p->name, p->age);
}
void test()
{
	struct DynamicArray* arr = NULL;
	initDynamicArr(&arr,3);
//	printf("%d",arr->size);
	struct Person p1 = {"hello",18};
	struct Person p2 = {"hello2",29};
	struct Person p3 = {"hello3",20};
	struct Person p4 = {"hello4",10};
	struct Person p5 = {"hello5",25};
	struct Person p6 = {"hello6",88};
	insert(arr,0,&p1);
	printf("%d\n",arr->size);
	printf("%d\n",arr->capacity);
	insert(arr,0,&p2);
	printf("%d\n",arr->size);
	printf("%d\n",arr->capacity);
	insert(arr,0,&p3);
	printf("%d\n",arr->size);
	printf("%d\n",arr->capacity);
	insert(arr,0,&p4);
	printf("%d\n",arr->size);
	printf("%d\n",arr->capacity);
	insert(arr,0,&p5);
	printf("%d\n",arr->size);
	printf("%d\n",arr->capacity);
	insert(arr,0,&p6);
	printf("%d\n",arr->size);
	printf("%d\n",arr->capacity);
//	userprint(arr->addr[5]);
	foreach(arr,userprint);
	


}
void userprint2(void *data)
{
	int* p = (int *)data;
	printf("%d\n",*p);
}
void test02()
{
	//开辟数组
	struct DynamicArray* arr = NULL;
	initDynamicArr(&arr, 3);
	//设定需要插入的数据
	int a = 10;
	int b = 11;
	int c = 12;
	int d = 13;
	int e = 14;
	int f = 15;
	//执行插入函数
	insert(arr,0,&a);
	insert(arr,0,&b);
	insert(arr,1,&c);
	insert(arr,0,&d);
	insert(arr,0,&e);
	insert(arr,0,&f);
	//遍历整个数组
	foreach(arr,userprint2);
}
int main(void)
{
	test02();
	system("pause");
	return EXIT_SUCCESS;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值