1.1 静态单链表
1.1.1 静态单链表的引出
- 如果需要频繁的增删数据,单链表就可以
- 如果数据元素的最大个数固定,那有没有更好的选择呢
1.1.2 单链表的缺陷
- 触发条件
- 长时间使用单链表对象频繁增加和删除数据元素
- 可能的结果
- 堆空间产生大量的内存碎片,导致系统运行缓慢
1.1.3 新的线性表
- 设计思路:在单链表的内部增加一片预留的空间,所有的Node 对象都在这片空间中动态创建和动态销毁
1.2 静态单链表的实现
1.2.1 实现思路
- 通过模板定义静态单链表类(StaticLinkList)
- 在类中定义固定大小的空间(unsigned char [])
- 重写create 和destroy 函数,改变内存的分配方式和归回方式
- 在Node类中重载operator new ,用于在指定内存上创建对象
1.2.2
template <typename T, int N>
class StaticLinkList : public LinkList<T>
{
protected:
typedef typename LinkList<T>::Node Node;
struct SNode : public Node
{
void * operator new(unsigned int size, void * loc)
{
return loc;
}
};
unsigned char m_space[sizeof(SNode) * N];
int m_used[N];
Node * create()
{
SNode * ret = NULL;
for(int i = 0; i < N; i++)
{
if(!m_used[i])
{
ret = reinterpret_cast<SNode*>(m_space) + i; //这里仅仅是创建了空间,如果Node的T类型是类类型,就需要构造函数的调用
ret = new(ret)SNode();
m_used[i] = 1;
break;
}
}
return ret;
}
void destory(Node * pn)
{
SNode * space = reinterpret_cast<SNode*>(m_space);
SNode * psn = dynamic_cast<SNode*>(pn);
for(int i = 0; i < N; i++)
{
if(pn == (space + i))
{
m_used[i] = 0;
psn->~SNode();
}
}
}
public:
StaticLinkList()
{
for(int i = 0; i < N; i++ )
{
m_used[i] = 0;
}
}
int capacity()
{
return N;
}
};
1.2.3 Q & A
- LinkList 中封装create 和destroy() 函数的意义?
- 为静态单链表(StaticLinkList)的实现做准备。StaticLinkList与 LinkList的不同仅在与链表节点内存分配上的不同,因此,将仅有的不同封装于父类和子类的虚函数中
参考一 : 狄泰软件课程
如有侵权:请联系邮箱 1986005934@qq.com