您的位置:首页 > 其它

单数组实现双向链表和内存管理(资源池)

2015-11-12 23:02 393 查看
单数组实现双向链表,链表分为 已使用部分和 空闲部分,通过两个变量记录头结点来标示。申请内存时从空闲部分把对应结点移入已使用部分,释放时相反。申请内存时是从Free空间里面顺序提取,所以该部分只需要使用到单向链表的功能就行,释放时,位置不定,需要使用到双向链表的功能。

#include <stdio.h>
#include <string.h>
int FREE_INDEX;
int WORK_INDEX;
#define GetKey(L, k, val) ( (val) = (L)[( (k) - 1 ) * 3 + 1] )
#define GetPrev(L, k, val) ( (val) = (L)[( (k) - 1 ) * 3] )
#define GetNext(L, k, val) ( (val) = (L)[( (k) - 1 ) * 3 + 2] )

#define SetKey(L, k, val) ((L)[( (k) - 1 ) * 3 + 1] = (val) )
#define SetPrev(L, k, val) ((L)[( (k) - 1 ) * 3] = (val) )
#define SetNext(L, k, val) ((L)[( (k) - 1 ) * 3 + 2] = (val) )
#define Clear(L, k) memset( (L) + ((k) - 1 ) * 3, 0 , 3 * sizeof(*(L)) )
void Init_D(int * L, int len)
{
memset(L, 0, len * 3 * sizeof(int));

FREE_INDEX = 1;
WORK_INDEX = 0;

for (int i = 1; i < len; i++)
{
SetNext(L, i, i + 1);
}
}

int Alloc_D(int *L)
{
int theNode = FREE_INDEX;
if (FREE_INDEX != 0)
{
GetNext(L, theNode, FREE_INDEX);
Clear(L, theNode);
}
return theNode;
}

void Free_D(int * L, int k)
{
int thePrev;
int theNext;

if (k == 0)
{
return;
}

GetNext(L, k, theNext);
GetPrev(L, k, thePrev);

if (thePrev != 0)
{
SetNext(L, thePrev, theNext);
}
if (theNext != 0)
{
SetPrev(L, theNext, thePrev);
}

if (k == WORK_INDEX)
{
WORK_INDEX = theNext;
}

Clear(L, k);
SetNext(L, k, FREE_INDEX);

FREE_INDEX = k;
}

void Insert_D(int *L, int k)
{
if (k == 0)
{
return;
}

if (WORK_INDEX != 0)
{
SetPrev(L, WORK_INDEX, k);
}

SetNext(L, k, WORK_INDEX);
SetPrev(L, k, 0);
WORK_INDEX = k;
}

考虑到只实现资源池的话Insert_D的功能可以合并到Alloc_D里面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息