【複習】手寫數據結構之動態數組(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");
}

運行截圖:

 

 

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