数据结构-2. 动态数组

动态数组设计

struct dynamicArray
{
	void** pAddr;  //维护真实在堆区创建的数组的指针

	int m_capacity; //数组容量

	int m_size; // 数组大小
};

数组初始化

struct dynamicArray * init_DynamicArry(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)
	{
		// 申请更大空间
		int newCapacity = array->m_capacity * 2;
		
		// 创建新空间
		void ** newSpace = malloc(sizeof(void*) * newCapacity);
		
		//将原有数据拷贝到新空间下
		memcpy(newSpace, array->pAddr, sizeof(void*) * array->m_capacity);
		
		//释放原有内存
		free(array->pAddr);
		
		//更新新空间指向
		array->pAddr = newSpace;
		
		//更新新容量
		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 myPrintPerson(void *data)
{
	struct Person* p = data;
	printf("姓名:%s	年龄:%d\n", p->name, p->age);
}

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 (NULL == array)
	{
		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--;
}

删除数据-按值删除

int myComparePerson(void *data1, void *data2)
{
	struct Person * p1 = data1;
	struct Person * p2 = data2;
	return strcmp(p1->name, p2->name) == 0 && p1->age == p2->age;
}

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

	free(array);
	array= NULL;
}
posted @ 2024-07-25 17:14  ffff5  阅读(7)  评论(0编辑  收藏  举报