栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言 动态数组

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言 动态数组

dynamicArray.h
#ifndef _DYNAMICARRAY_H_
#define _DYNAMICARRAY_H_

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include



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

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

//申请数组空间
struct dynamicArray *init_DynamicArray(int capacity);

//插入功能
void insert_dynamicArray(struct dynamicArray *array, int pos, void *data);

//遍历功能
void foreach_DynamicArray(struct dynamicArray *array, void(*myPrintPerson)(void*));

//删除功能
void removeByPos_DynamicArray(struct dynamicArray *arr, int pos);//按位置
void removeByValue_DynamicArray(struct dynamicArray *arr, void *data, int(*compaperPerson)(void*, void*));//按数据删除

//销毁数组
void destory_DynamicArray(struct dynamicArray *arr);

//-----------自定义测试数据----------------
void myPrintPerson(void * data);

int compaperPerson(void *data1, void *data2);

#endif
dynamicArray.c
#include "dynamicArray.h"

//申请数组空间
struct dynamicArray *init_DynamicArray(int capacity)
{
	if (capacity <= 0)
		return NULL;

	struct dynamicArray *array = malloc(sizeof(struct dynamicArray));
	//判断内存是否申请成功
	if (array == NULL)
		return NULL;

	//设置容量
	array->m_capacity = capacity;
	//设置大小
	array->m_size = 0;
	//维护在堆区数组的指针
	array->pAddr = malloc(sizeof(void*)*array->m_capacity);

	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 new_Capacity = array->m_capacity * 2;
		//2.创建新空间
		void ** new_Space = malloc(sizeof(void*)*new_Capacity);
		//3.将原有数组拷贝到新空间下
		memcpy(new_Space, array->pAddr, sizeof(void*)*array->m_capacity);
		//4.释放原有空间
		free(array->pAddr);
		//5.更改指针指向
		array->pAddr = new_Space;
		//6.更新大小的容量
		array->m_capacity = new_Capacity;
	}
	//插入新数据
	//从最后一个位置开始 依次移动数据 后移
	for (int i = array->m_size - 1; i >= pos; i--)
	{
		array->pAddr[i + 1] = array->pAddr[i];
	}
	//将新元素插入指定位置
	array->pAddr[pos] = data;
	//更新大小
	array->m_size++;
	return;
}
//遍历功能
void foreach_DynamicArray(struct dynamicArray *array, void(*myPrintPerson)(void*))
{
	if (array == NULL)
		return;
	if (myPrintPerson == NULL)
		return;

	for (int i = 0; i < array->m_size; ++i)
	{
		myPrintPerson(array->pAddr[i]);
	}
	return;
}
//删除功能
void removeByPos_DynamicArray(struct dynamicArray *arr, int pos)
{
	if (arr == NULL)
		return;
	if (pos < 0 || pos > arr->m_size - 1)
		return;

	for (int i = pos; i < arr->m_size - 1; ++i)
	{
		arr->pAddr[i] = arr->pAddr[i + 1];
	}
	arr->m_size--;
	return;
}
void removeByValue_DynamicArray(struct dynamicArray *arr, void *data, int(*compaperPerson)(void*, void*))
{
	if (arr == NULL || data == NULL)
		return;
	for (int i = 0; i < arr->m_size; ++i)
	{
		if (compaperPerson(arr->pAddr[i], data))
		{
			removeByPos_DynamicArray(arr, i);
			break;
		}
	}
	return;
}
//销毁数组
void destory_DynamicArray(struct dynamicArray *arr)
{
	if (arr == NULL)
		return;

	if (arr->pAddr != NULL)
	{
		free(arr->pAddr);
		arr->pAddr = NULL;
	}
	free(arr);
	return;
}

void myPrintPerson(void * data)
{
	struct Person *p = data;
	printf("姓名:%s 年龄:%dn", p->name, p->age);
	return;
}
int compaperPerson(void *data1, void *data2)
{
	struct Person *p1 = data1;
	struct Person *p2 = data2;
	return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}
main.c
#include "dynamicArray.h"

void test01()
{
	struct dynamicArray * arr = init_DynamicArray(5);
    
	struct Person p1 = { "亚瑟", 18 };
	struct Person p2 = { "王昭君", 28 };
	struct Person p3 = { "赵云", 38 };
	struct Person p4 = { "张飞", 19 };
	struct Person p5 = { "关羽", 20 };
	struct Person p6 = { "宫本", 25 };

	printf("容量:%d  大小:%dn", arr->m_capacity, arr->m_size);
	insert_dynamicArray(arr, 0, &p1);
	insert_dynamicArray(arr, 0, &p2);
	insert_dynamicArray(arr, 0, &p3);
	insert_dynamicArray(arr, 2, &p4);
	insert_dynamicArray(arr, 10, &p5);
	insert_dynamicArray(arr, 1, &p6); 
	
	// 赵云 宫本 王昭君 张飞 亚瑟 关羽
	foreach_DynamicArray(arr, myPrintPerson);
	printf("容量:%d  大小:%dn", arr->m_capacity, arr->m_size);

	removeByPos_DynamicArray(arr, 2);
	foreach_DynamicArray(arr, myPrintPerson);
	printf("容量:%d  大小:%dn", arr->m_capacity, arr->m_size);

	struct Person p = { "张飞", 19 };
	removeByValue_DynamicArray(arr, &p, compaperPerson);
	foreach_DynamicArray(arr, myPrintPerson);

	destory_DynamicArray(arr);
	arr = NULL;

}
int main(int argc, char* argv[])
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}
测试结果:

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019232.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号