使用模拟指针有时比使用指针描述更方便间接,甚至更快。下面用数组实现指针的模拟。
创建SimNode类定义结点:
template<class T>
class SimNode {
friend SimSpace<T>;
private:
T data;
int link;
};
定义功能:
template<class T>
class SimSpace {
public:
SimSpace(int MaxSpaceSize = 100);
~SimSpace(delete [] node);
int Allocate();//分配结点
void Deallocate(int& i);//释放结点
private:
int NumberOfNodes, first;
SimNode<T> *node//结点数组
};
函数SimSpace()初始化可用空间表:
template<class T>
SimSpace<T>::SimSpace(int MaxSpaceSize)
{
NumberOfNodes = MaxSpaceSize;
node = new SimNode<T>[NumberOfNodes];
for (int i = 0; i < NumberOfNodes - 1; i++)
{
node[i].link = i + 1;
}
node[NumberOfNodes - 1].link = -1;
first = 0;
}
分配一个结点的函数Allocate()和释放一个结点的函数Deallocate():
template<class T>
int SimSpace<T>::Allocate()
{
if (first == -1)throw NoMem();
int i = first;
first = node[i].link;
return i;
}
template<class T>
void SimSpace<T>::Deallocate(int& i)
{
node[i].link = first;
first = i;
i = -1;
}
通过构造两个空间表可以减少构造函数的运行时间,第一个表包含所有未被使用的结点,第二个表包含至少使用过一次的自由结点。令first1和first2分别指向第一个和第二个表的首结点,则以上函数作相应调整:
template<class T>
SimSpace<T>::SimSpace(int MaxSpaceSize)
{
NumberOfNodes = MaxSpaceSize;
node = new SimNode<T>[NumberOfNodes];
first1 = 0;
first2 = -1;
}
template<class T>
int SimSpace<T>::Allocate()
{
if (first2 == -1)
{
if (first1 == NumberOfNodes)throw NoMem();
return first1++;
}
int i = first2;
first2 = node[i].link;
return i;
}
template<class T>
void SimSpace<T>::Deallocate(int& i)
{
node[i].link = first2;
first2 = i;
i = -1;
}