c语言数据结构动态数组,C语言数据结构算法——动态数组

#include //1.先把所需要的数据信息结构定义下来、

struct DynamicArray

{

//数组存储元素的空间的首地址

void **addr;

// 存储数据的内存中

int capacity; //容量

//当前存储数据的内存中有多少个元素

int size;//大小

};

//初始化数组

//不推荐使用直接初始化 没有返回值

struct DynamicArray * INit_DynamicArray(int capacity)

{

//判断大小

if (capacity <= 0)

{

return NULL;

}

struct DynamicArray * arr = malloc(sizeof(struct DynamicArray));

arr->capacity = capacity;

arr->addr = malloc(sizeof(void *) *arr->capacity);

arr->size = 0; //第一次大小为0

return arr;

}

//插入元素

void Insert_DynamicArray(struct DynamicArray * arr, int pos, void *data) //插入元素必须拿到结构体 第一个参数

{

if (NULL == arr || NULL == data)

{

return;

}

if (pos < 0 || pos > arr->size)

{

pos = arr->size;

}

//判断空间是否足够

if (arr->size >= arr->capacity)

{

//1.申请一块更大的内存空间

int newcapacity = arr->capacity * 2;

void **newspace = malloc(sizeof(void *)* newcapacity);

//2.将原来空间的数据拷贝到新空间

memcpy(newspace, arr->addr, sizeof(void *)*arr->capacity);

//3.释放原空间内存

free(arr->addr);

//4.Updata addr 指向

arr->addr = newspace;

arr->capacity = newcapacity;

//空间变大了

}

//移动元素,给pos位置空出位置来

for (int i = arr->size - 1; i >= pos;--i)

{

//把当前i位置 放到后面

arr->addr[i + 1] = arr->addr[i];

}

// 将新元素插入到pos位置

arr->addr[pos] = data;

arr->size++;

}

//遍历元素 遍历需要知道数组大小,所以参数

void Foreach_DynamicArray(struct DynamicArray * arr, void(*_callback)(void*))

{

if (NULL == arr || NULL == _callback)

{

return;

}

for (int i = 0; i < arr->size;i++)

{

_callback(arr->addr[i]);

}

}

//销毁数组

void Destroy_DynamicArray(struct DynamicArray * arr)

{

if (arr==NULL)

{

return;

}

if (arr->addr!=NULL)

{

free(arr->addr);

arr->addr = NULL;

}

free(arr);

arr = NULL;

}

struct Person

{

char name[64];

int age;

};

void myPrint(void *data)

{

struct Person * person = (struct Person*)data;

printf("Name:%s Age:%d\n",person->name,person->age);

}

//位置删除

void RemoveByPos_DynamicArray(struct DynamicArray * arr,int pos)

{

if (NULL == arr)

{

return;

}

if (pos<0 || pos > arr->size-1)

{

return;

}

//删除的话 就类似于覆盖位置

for (int i = pos; i < arr->size - 1;++i)

{

arr->addr[i] = arr->addr[i + 1];

}

arr->size--;

}

//按值删除

void RemoveByValue(struct DynamicArray * arr, void *data,int(*compare)(void *,void *))

{

if (NULL == arr || NULL == data || NULL == compare)

{

return;

}

for (int i = 0; i < arr->size;++i)

{

if (compare(arr->addr[i],data))

{

//找到了位置然后调用之前函数 删除

RemoveByPos_DynamicArray(arr, i);

break;

}

}

}

int MyCompare(void *d1, void *d2)

{

struct Person *p1 = (struct Person *)d1;

struct Person *p2 = (struct Person *)d2;

return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;

}

void test()

{

//创建动态数组

struct DynamicArray *da = INit_DynamicArray(10);

//动态数组添加元素

struct Person p1 = { "aaa", 10 };

struct Person p2 = { "bbb", 20 };

struct Person p3 = { "ccc", 30 };

struct Person p4 = { "ddd", 40 };

struct Person p5 = { "eee", 50 };

struct Person p6 = { "fff", 60 };

Insert_DynamicArray(da, 0, &p1);

Insert_DynamicArray(da, 0, &p2);

Insert_DynamicArray(da, 0, &p3);

Insert_DynamicArray(da, 1, &p4);

Insert_DynamicArray(da, 1, &p5);

printf("capacity1:%d\n", da->capacity);

Insert_DynamicArray(da, 100, &p6);//3 5 4 2 1 6

printf("capacity2:%d\n", da->capacity);

Foreach_DynamicArray(da, myPrint);

printf("----------\n");

RemoveByPos_DynamicArray(da, 2);// 3 5 2 1 6

Foreach_DynamicArray(da, myPrint);

printf("----------\n");

struct Person pDal = { "aaa", 10 };

RemoveByValue(da, &pDal,MyCompare);

Foreach_DynamicArray(da, myPrint);

//销毁

Destroy_DynamicArray(da);

}

int main()

{

test();

system("pause");

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值