在準備面試前很焦躁,複習下數據結構安安神。
實現動態數組思路:先初始化一塊內存區域,當插入的數據容量大於該內存區域時,新開闢一塊內存,將整個數據移到新內存;
以下爲簡單的代碼實現,實現了動態內存的開闢,轉移,回收,數據的插入 刪除 讀取打印;
純記錄 供日後回頭看。僅供參考,如有不對,望指教;
/**************************************************************************************
*動態數組 當內存不夠時,重新申請內存,將舊的內存拷到新的內存上 再釋放舊內存;
* 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");
}
運行截圖: