动态数组(C语言版)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>

struct dynamicArray
{
	void ** pAddr;    //维护真实在堆区创建的数组的指针
	
	int m_capacity;    //数组容量
	
	int m_size;    //数组大小
};

//初始化数组
struct dynamicArray * init_DynamicArray(int capacity)
{
	if (capacity <= 0)
	{
		return NULL;
	}
	//给数组分配空间
	struct dynamicArray * array = malloc(sizeof(struct dynamicArray));
	
	if (array == NULL)
	{
		return NULL;
	}
	
	array->pAddr = malloc(sizeof(void *) * capacity);
	array->m_capacity = capacity;
	array->m_size = 0;
	
	return array;
};

//插入数组
void insert_dynamicArray(struct dynamicArray * array, int pos, void * data)
{
	if (array == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	//无效位置 尾插
	if (pos < 0 || pos > array->m_size)
	{
		pos = array->m_size;
	}
	//如果满了,就动态扩展
	if (array->m_size >= array->m_capacity)
	{
		//1、申请更大内存空间
		int newCapacity = array->m_capacity * 2;
		
		//2、创建新空间
		void ** newSpace = malloc(sizeof(void *) * newCapacity);
		
		//3、将原有数据拷贝到新空间下
		memcpy(newSpace, array->pAddr, sizeof(void *) * array->m_capacity);
		
		//4、释放原有内存空间
		free(array->pAddr);
		
		//5、更新新空间指向
		array->pAddr = newSpace;
		
		//6、更新新容量
		array->m_capacity = newCapacity;
	}
	
	//插入新元素
	
	//移动元素 进行插入新元素
	for (int i = array->m_size - 1; i >= pos; i--)
	{
		//数据向后移动
		array->pAddr[i+1] = array->pAddr[i];
	}
	//将新元素 插入到指定位置上
	array->pAddr[pos] = data;
	//更新大小
	array->m_size++;
}

//遍历数组
void foreach_DynamicArray(struct dynamicArray * array, void(*myPrint)(void*))
{
	if (array == NULL)
	{
		return;
	}
	if (myPrint == NULL)
	{
		return;
	}
	for (int i = 0; i < array->m_size; i++)
	{
		myPrint(array->pAddr[i]);
	}
}

//删除数组 按位置删除
void removeByPos_DynamicArray(struct dynamicArray * array, int pos)
{
	if (array == NULL)
	{
		return;
	}
	if (pos < 0 || pos >array->m_size - 1)
	{
		return;
	}
	//数据前移
	for (int i = pos; i < array->m_size - 1; i++)
	{
		array->pAddr[i] = array->pAddr[i + 1];
	}
	//更新数组大小
	array->m_size--;
}

void removeByValue_DynamicArray(struct dynamicArray * array, void* data, int (*myCompare)(void *, void *))
{
	if (array == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	for (int i = 0; i < array->m_size; i++)
	{
		if (myCompare(array->pAddr[i], data))
		{
			//如果找到要删除的数据,i就是要删除的具体位置
			removeByPos_DynamicArray(array, i);
			break;
		}
	}
}

//销毁
void destroy_DynamicArray(struct dynamicArray * array)
{
	if (array == NULL)
	{
		return;
	}
	if (array->pAddr != NULL)
	{
		free(array->pAddr);
		array->pAddr = NULL;
	}
}






struct Person
{
	char name[64];
	int age;
};

void myPrintPerson(void *data)
{
	struct Person * p = data;
	printf("姓名:%s   年龄:%d\n", p->name, p->age);
}

int myCompare(void * data1, void * data2)
{
	struct Person * p1 = data1;
	struct Person * p2 = data2;
	return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值