一.问题
给定大小1000个一维数组,我们如何快速的分配空闲的下标,同时释放的时候也能快速归还,常规的方法我们使用for循环,使用的资源结构体里面增加使用flag标记,标志该资源使用,但是当数组资源多的时候,性能下降很严重。我们可以设计一个类似的数组链表管理相应的数组下标,申请相应大小加2的1002容量内存管理链表,前1000个依次初始化从1到1000,后面到时第二个初始化为0,最后一个初始化成1000。
二.实战
#include <stdio.h>
#include <stdlib.h>
#define MAX_ARRAY_NUM 1000
int AllocArrayIndex(int *pindex,int *pMng)
{
if(NULL == pMng || NULL == pindex)
{
return -1;
}
*pindex = pMng[0];
if ( *pindex == 0 || *pindex > MAX_ARRAY_NUM )
{
return -1;
}
pMng[0] = pMng[*pindex];
if ( pMng[0] == 0 )
{
pMng[MAX_ARRAY_NUM +1] = 0;
}
pMng[*pindex] = 0xFFFFFFFF;
return 0;
}
int FreeArrayIndex(int index,int *pMng)
{
int dwLastIndex = 0;
if(NULL == pMng)
{
return -1;
}
if( index > MAX_ARRAY_NUM )
{
return -1;
}
if ( pMng[index] != 0xFFFFFFFF )
{
return -1;
}
pMng[index] = 0;
dwLastIndex = pMng[MAX_ARRAY_NUM+1];
pMng[dwLastIndex] = index;
pMng[MAX_ARRAY_NUM+1] = index;
return 0;
}
void ShowMngInfo(int *pMng)
{
int i;
int count = 0;
if(NULL == pMng)
{
return;
}
for(i=0;i<MAX_ARRAY_NUM + 1;i++)
{
printf("%d-->",pMng[i]);
if(++count%20 == 0)
{
printf("\n");
}
}
printf("%d",pMng[i]);
}
int main()
{
int *pMng = NULL;
int i;
int index;
pMng = (int*)malloc(sizeof(int)*(MAX_ARRAY_NUM + 2));
if(pMng == NULL)
{
return -1;
}
/*1.管理链表初始化*/
for( i = 0; i < MAX_ARRAY_NUM; i++ )
{
pMng[i] = i + 1;
}
pMng[MAX_ARRAY_NUM] = 0;
pMng[MAX_ARRAY_NUM + 1] = MAX_ARRAY_NUM;
/*2.打印单向链表*/
ShowMngInfo(pMng);
for(i = 0; i < MAX_ARRAY_NUM+1;i++)
{
if(-1 == AllocArrayIndex(&index,pMng))
{
printf("Alloc Fail\n");
}
else
{
printf("Alloc index:%d\n",index);
}
}
ShowMngInfo(pMng);
for(i = 1; i < MAX_ARRAY_NUM+1 ;i++)
{
if(-1 == FreeArrayIndex(i,pMng))
{
printf("Free Fail\n");
}
}
ShowMngInfo(pMng);
}