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;
}