【复习】手写数据结构之动态数组(C语言)

在准备面试前很焦躁,复习下数据结构安安神。

实现动态数组思路:先初始化一块内存区域,当插入的数据容量大于该内存区域时,新开辟一块内存,将整个数据移到新内存;

以下为简单的代码实现,实现了动态内存的开辟,转移,回收,数据的插入 删除 读取打印;

纯记录 供日后回头看。仅供参考,如有不对,望指教;

 

/**************************************************************************************
*动态数组 当内存不够时,重新申请内存,将旧的内存拷到新的内存上 再释放旧内存;
* 19.08.01    by finer   *.*
**************************************************************************************/
#include <stdio.h>
#include <stdlib.h>

//动态数组框架;
typedef struct DYNAMICARRAY
{
	int* pAddr;
	int size;
	int capacity;
}DynamicArray;

//动态数组初始化;
DynamicArray* init_DynamicArray(DynamicArray* dyArr)
{
	dyArr = (DynamicArray*)malloc(sizeof(DynamicArray));
	dyArr -> pAddr = (int*) malloc(sizeof(int)*10);
	dyArr -> capacity = 10;
	dyArr -> size = 0;
	return dyArr;
}

//新旧内存交换数据;
//@param oldAddr 旧内存的地址;
//@param size 旧内存的容量;
//@param newAddr 新内存的地址;
void swapData(int* oldAddr, int size, int* newAddr)
{
	for (int i = 0; i < size; ++i)
	{
		newAddr[i] = oldAddr[i];
	}
}

// 动态数组 插入数据;
void  insertData_DynamicArray(DynamicArray* dyArr,const int data)
{

	if (dyArr == NULL)
	{
		return;
	}

	//判断容量是否超出;
	if (dyArr->size > dyArr->capacity-1)
	{
		// 新内存为旧内存的2倍;
		int* pTemp = (int*)malloc(sizeof(int)* dyArr->capacity*2);
		swapData(dyArr->pAddr, dyArr->capacity, pTemp);

		free(dyArr->pAddr); //释放旧内存;
		dyArr->pAddr = NULL;
		dyArr->pAddr = pTemp;  //拷贝新地址;
		pTemp = NULL;

		dyArr->capacity = dyArr->capacity * 2;	  //更新容量;

		//finer: 容量更新后记得传入新的数据;
		dyArr->pAddr[dyArr->size] = data; //插入新数据;
		dyArr->size++;
	}
	else
	{
		dyArr->pAddr[dyArr->size] = data; //插入新数据;
		dyArr->size++;
	}
}

//释放内存;
void destory_dynamicArray(DynamicArray* dyArr)
{
	free(dyArr->pAddr);
	dyArr->pAddr = NULL;
	free(dyArr);
	dyArr = NULL;
}

//打印输出;

void print_dydnamicArray(DynamicArray* dyArr)
{
	for (int i = 0; i < dyArr->size; ++i)
	{
		printf("%d ", dyArr->pAddr[i]);

	}
	printf("\n");
		printf("共有%d个元素", dyArr->size);
		printf("\n");
}

void remomveData_dynamicArray(DynamicArray* dyArr,int pose)
{
	if (dyArr == NULL)
	{
		return;
	}

	{
		for (int i = pose; i < dyArr->size - 1; ++i)
		{

			dyArr->pAddr[i] = dyArr->pAddr[i + 1];
		}

		dyArr->size--;
	}


}
int main()
{

	DynamicArray* dynamicArray = NULL;
		
	dynamicArray = init_DynamicArray(dynamicArray); //初始化动态数组;
	
	printf("------------测试插入数据-------------\n");
	for (int i = 0; i < 50; ++i)
	{
		insertData_DynamicArray(dynamicArray, i);

	}

	print_dydnamicArray(dynamicArray);


	printf("------------测试删除-------------\n");
	remomveData_dynamicArray(dynamicArray,10);
	remomveData_dynamicArray(dynamicArray, 50);
	print_dydnamicArray(dynamicArray);

	destory_dynamicArray(dynamicArray);  

	system("pause");
}

运行截图:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章