数据结构-动态数组

1 动态数组的实现

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>

typedef struct dynamicArry_st
{
	//真实在堆区开辟的数字的指针
	void** pArry;
	//容量大小
	int m_Capcity;
	//数组大小
	int m_Size;
}dynamicArry;


//初始化数组
dynamicArry* init_dynamicArry(int capacity)
{
	if (capacity == 0)
	{
		return NULL;
	}

	//开辟空间
	dynamicArry* dynamic = (dynamicArry*)malloc(sizeof(dynamicArry));
	if (dynamic == NULL)
	{
		return NULL;
	}

	//开辟成员的空间
	void** parry = (void**)malloc(sizeof(void*) * capacity);
	if (parry == NULL)
	{
		return NULL;
	}
	dynamic->pArry = parry;

	//初始化
	dynamic->m_Capcity = capacity;
	dynamic->m_Size = 0;

	return dynamic;
}

//插入数组
void insert_dynamicArray(dynamicArry* arr, void* data, int index)
{
	if (arr == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}


	//判断数组是否满了
	if (arr->m_Capcity == arr->m_Size)
	{
		//1.计算新内存空间大小
		int newCapacity = arr->m_Capcity * 2;

		//2.开辟空间
		void** newArr = (void**)malloc(sizeof(void*) * newCapacity);

		//3.将原空间的内容拷贝到新空间下
		memcpy(newArr, arr->pArry, sizeof(void*) * (arr->m_Capcity));

		//4.释放空间
		free(arr->pArry);

		//5.更改指针指向
		arr->pArry = newArr;

		//6.更新容量
		arr->m_Capcity = newCapacity;
	}

	if (index < 0 || index > arr->m_Size)
	{
		//尾插
		index = arr->m_Size;

	}


	//将元素插入指定位置
	for (int i = arr->m_Size; i > index; i--)
	{
		arr->pArry[i] = arr->pArry[i - 1];
	}
	arr->pArry[index] = data;

	//更新大小
	arr->m_Size++;

}


//遍历
void foreach(dynamicArry* arr, void(*sshow)(void*))
{
	if (arr == NULL)
	{
		return;
	}
	for (int i = 0; i < arr->m_Size; i++)
	{
		sshow(arr->pArry[i]);
	}

}





//用户
//测试动态数组

typedef struct Person_st
{
	char name[64];
	int age;
}person;

//回调函数 打印数据
void sshow(void* data)
{
	person* p = (person*)data;
	printf("姓名:%s,年龄:%d\n", p->name, p->age);

}

//删除数组
//按照位置删除数据
void removeSet(dynamicArry* arr, int pos)
{
	if (arr == NULL)
	{
		return;
	}
	if (pos < 0 || pos >= arr->m_Size)
	{
		return;
	}
	for (int i = pos; i < arr->m_Size - 1; i++)
	{
		arr->pArry[i] = arr->pArry[i + 1];
	}
	arr->m_Size--;
}

int compare(void* data1, void* data2)
{
	person* p1 = (person*)data1;
	person* p2 = (person*)data2;
	if (strcmp(p1->name, p2->name) ==0 && (p1->age == p2->age))
	{
		return 0;
	}
	return 1;

}


//按值删除数据
void removeData(dynamicArry* arr, void* data,int(*compare)(void*,void*))
{
	if (arr == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	person* p = (person*)data;
	for (int i = 0; i < arr->m_Size; i++)
	{
		if (compare(arr->pArry[i], data) == 0)
		{
			removeSet(arr, i);
			break;
		}
	}

}

void test01()
{
	//初始化数组
	dynamicArry* dynamic = init_dynamicArry(5);

	printf("插入前 容量为%d,大小为%d\n", dynamic->m_Capcity, dynamic->m_Size);

	//插入数据
	person p1 = { "小阿",18 };
	person p2 = { "小东",14 };
	person p3 = { "小哈",11 };
	person p4 = { "小干",13 };
	person p5 = { "小嘎",12 };
	person p6 = { "小学",19 };

	insert_dynamicArray(dynamic, &p1, 0);
	insert_dynamicArray(dynamic, &p2, 4);
	insert_dynamicArray(dynamic, &p3, 2);
	insert_dynamicArray(dynamic, &p4, 5);
	insert_dynamicArray(dynamic, &p5, 6);
	insert_dynamicArray(dynamic, &p6, 7);

	printf("插入后 容量为%d,大小为%d\n", dynamic->m_Capcity, dynamic->m_Size);

	//遍历
	foreach(dynamic, sshow);
	//按位置删除
	removeSet(dynamic, 2);
	printf("--------------\n");
	foreach(dynamic, sshow);

	printf("--------------\n");
	//按值删除

	removeData(dynamic, &p5,compare);
	foreach(dynamic, sshow);
}




int main()
{
	test01();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值