模拟指针学习笔记(1)-实现模拟指针系统

使用模拟指针有时比使用指针描述更方便间接,甚至更快。下面用数组实现指针的模拟。
创建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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值