在准备面试前很焦躁,复习下数据结构安安神。
实现动态数组思路:先初始化一块内存区域,当插入的数据容量大于该内存区域时,新开辟一块内存,将整个数据移到新内存;
以下为简单的代码实现,实现了动态内存的开辟,转移,回收,数据的插入 删除 读取打印;
纯记录 供日后回头看。仅供参考,如有不对,望指教;
/**************************************************************************************
*动态数组 当内存不够时,重新申请内存,将旧的内存拷到新的内存上 再释放旧内存;
* 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");
}
运行截图: