数据结构----动态数组

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//动态数组结构体
struct dynamicArray
{
	void** pAddr;
	int m_capacity;
	int m_size;
};

//初始化数组
struct dynamicArray* initDynamicArray(int capacity)
{
	//1.判断输入容量
	if (capacity <= 0)
	{
		return NULL;
	}

	//2.给数组结构体分配空间
	struct dynamicArray* arry = (struct dynamicArray*) malloc(sizeof(struct dynamicArray));
	if (arry == NULL)
	{
		return NULL;
	}

	//3.数组结构体属性初始化
	arry->pAddr = (void**)malloc(sizeof(void*) * capacity);
	arry->m_capacity = capacity;
	arry->m_size = 0;

	return arry;
}

//插入
void insertDynamicArray(struct dynamicArray* arry, int pos, void* data)
{
	//1.判断输入参数的有效性
	if (arry == NULL || data == NULL)
	{
		return ;
	}
	if (pos < 0 || pos > arry->m_size)  //pos越界,默认尾插
	{
		pos = arry->m_size;
	}

	//2.判断数组是否已满,满了动态扩展
	if (arry->m_size == arry->m_capacity)
	{
		int new_capacity = arry->m_capacity * 2;  //新空间大小

		void** new_space = (void**)malloc(sizeof(void*) * new_capacity);   //开辟新空间

		memcpy(new_space, arry->pAddr, sizeof(void*) * arry->m_capacity);  //将原有数据拷贝到新空间

		free(arry->pAddr);  //释放原来空间
		arry->pAddr = new_space;  //指向新空间
		arry->m_capacity = new_capacity;  //更新容量
	}

	//3.pos位置后的元素向后移动一位,注意:从右向左移动方便
	for (int i = arry->m_size - 1; i >= pos; i--)
	{
		arry->pAddr[i + 1] = arry->pAddr[i];
	}

	//4.插入
	arry->pAddr[pos] = data;

	arry->m_size++;  //更新数组大小
}

//遍历数组
void foreachDynamicArray(struct dynamicArray* arry, void (*myPrint)(void*))
{
	if (arry == NULL || myPrint == NULL)
	{
		return;
	}
	if (arry->m_size == 0)
	{
		return;
	}

	for (int i = 0; i < arry->m_size; i++)
	{
		myPrint(arry->pAddr[i]);
	}
}

//按位置删除数组元素
void removeByPosDynamicArray(struct dynamicArray* arry, int pos)
{
	//1.判断
	if (arry == NULL)
	{
		return;
	}
	if (arry->m_size == 0)
	{
		return ;
	}
	if (pos < 0 || pos >= arry->m_size)
	{
		return;
	}

	//2. 删除, 向前覆盖
	for (int i = pos; i < arry->m_size-1; i++)  //删除最后一个元素直接m_size--即可
	{
		arry->pAddr[i] = arry->pAddr[i + 1];
	}

	//3.更新
	arry->m_size--;
}

//按值删除
void removeByValueDynamicArray(struct dynamicArray* arry, void* data, bool(*myCompare)(void*, void*))
{
	//1.判断
	if (arry == NULL || data == NULL || myCompare == NULL)
	{
		return;
	}
	if (arry->m_size == 0)
	{
		return;
	}

	//2.删除
	for (int i = 0; i < arry->m_size; i++)
	{
		if (myCompare(arry->pAddr[i], data))
		{
			//如果找到要删除的数据,i就是要删除的具体位置
			removeByPosDynamicArray(arry, i);
			break;  //只删除第一次出现的
		}
	}

	//3.更新,removeByPosDynamicArray中已经更新过了
}

//销毁数组
void destroyDynamicArray(struct dynamicArray* arry)
{
	if (arry == NULL)
	{
		return;
	}

	//先销毁属性的指针,再销毁结构体指针
	if (arry->pAddr != NULL)
	{
		free(arry->pAddr);
		arry->pAddr = NULL;
	}
	free(arry);
	arry = NULL;
}


//----------测试-----------
//自定义类型
struct Person
{
	char name[64];
	int age;
};

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

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

int main()
{
	struct dynamicArray* arry = initDynamicArray(5);

	struct Person p1 = {"san", 11};
	struct Person p2 = { "si", 22 };
	struct Person p3 = { "wu", 33 };
	struct Person p4 = { "wu", 33 };

	insertDynamicArray(arry, 0, &p1);
	insertDynamicArray(arry, 1, &p2);
	insertDynamicArray(arry, 2, &p3);
	insertDynamicArray(arry, 0, &p4);

	foreachDynamicArray(arry, myPrint);

	//removeByPosDynamicArray(arry, 2);
	//foreachDynamicArray(arry, myPrint);

	printf("------------\n");
	struct Person p = { "wu", 33 };
	removeByValueDynamicArray(arry, &p, myCompare);
	foreachDynamicArray(arry, myPrint);

	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值