单数组实现双向链表和内存管理(资源池)
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里面
#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里面
相关文章推荐
- 动易2006序列号破解算法公布
- IE7降低内存和降低CPU的几个技巧
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#动态调整数组大小的方法
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 如何高效的使用内存
- DOS下内存的配置
- 详解Lua中的数组概念知识
- Lua的内存管理浅析
- Perl中的列表和数组学习笔记
- XP/win2003下发现1G的内存比512M还慢的解决方法
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- 超大数据量存储常用数据库分表分库算法总结
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧