- 实现链式数据结构有两种方式,指针和数组,与指针相比较,采用数组方式,对内存的使用更加紧凑,但对链表的最大长度有所限制。
- 实现的思路是分别利用对象的prev,next字段表示前驱和后继对象的数组下标,另外将链表的头保存在一个全局变量中。当向链表中插入一个新对象时,必须分配一个尚未利用的对象的下标,因此,有必要对数组中尚未利用的对象空间进行管理,我们把空闲对象保存在一个单链表中,称为自由表。自由表表头同样保存在一个全局变量freeHead中,自由表只使用对象的next字段。
- 自由表的AllocateObject方法,分配一个自由对象,返回其下标值,如果自由表为空,则返回-1。FreeObject方法,释放下标为参数pos的对象到自由表中。
#include <cassert>
#include <iostream>
using namespace std;
struct Object
{
int prev;
int key;
int next;
};
constexpr int SIZE = 10;
Object array[SIZE];
int freeHead = 0;
void InitFreeList()
{
for(int i = 0; i != SIZE-1; ++i)
array[i].next = i+1;
array[SIZE-1].next = -1;
}
int AllocateObject()
{
int curFree = freeHead;
if(curFree != -1)
freeHead = array[curFree].next;
return curFree;
}
void FreeObject(int pos)
{
assert(pos >= 0 && pos < SIZE);
int curFree = freeHead;
freeHead = pos;
array[freeHead].next =curFree;
}
void Test()
{
InitFreeList();
for(int i = 0; i != SIZE; ++i)
cout << AllocateObject() << "\t";
cout << endl; //0 1 2...9
cout << AllocateObject() << endl; // -1
for(int i = 0; i != SIZE; i += 2)
FreeObject(i);
for(int i = 0; i != SIZE/2; ++i)
cout << AllocateObject() << "\t";
cout << endl; //8 6 4 2 0
}
运行Test()输出结果为:
0 1 2 3 4 5 6 7 8 9
-1
8 6 4 2 0