使用游标(cursor)来模拟指针,由程序员自己编写“分配结点”和“回收结点”的过程。
每个节点应含有两个域:element域和next域。
next域是游标指示器,指示其后继结点在结构数组中的相对位置(即数组的下标),数组的第0个分量可以设计成表的头结点。
//文件 CursorList.h,静态链表的定义
#ifndef CursorList_
#define CursorList_
template <class Object>
class CursorListItr;
template <class Object>
class CursorList
{
public:
CursorList();
CursorList(const CursorList & rhs);
~CursorList();
bool isEmpty() const;
void makeEmpty();
CursorListItr<Object> first() const;
void insert(const Object & x, const CursorListItr<Object> & p);
CursorListItr<Object> find(const Object & x) const;
CursorListItr<Object> findPrevious(const Object & x) const;
void remove(const Object & x);
public:
struct CursorNode
{
CursorNode() : next(0) {}
private:
CursorNode(const Object & theElement, int n):element(theElement), next(n) {}
Object element;
int next;
friend class CursorList<Object>;
friend class CursorListItr<Object>;
};
private:
int header;
static vector<CursorNode> cursorSpace;
static void initializeCursorSpace();
static int alloc();
static void free(int p);
friend class CursorListItr<Object>;
};
//CursorListItr类:维护 "当前位置"
template <class Object>
class CursorListItr
{
public:
CursorListItr() : current(0) {}
bool isPastEnd() const
{ return current == 0; }
void advance()
{
if (!isPastEnd())
current = CursorList<Object>::cursorSpace[current].next;
}
const Object & retrieve() const
{
if (isPastEnd()) throw BadIterator();
return CursorList<Object>::cursorSpace[current].element;
}
private:
int current; //当前位置
friend class CursorList<Object>;
CursorListItr(int theNode) : current(theNode) { }
};
#endif // CursorList_
//静态链表的主要实现如下面代码所示
#include "CursorList.h"
//初始化
template <class Object>
void CursorList<Object>::initializeCursorSpace()
{
static int cursorSpaceIsInitialized = false;
if (!cursorSpaceIsInitialized)
{
cursorSpace.resize(100);
for (int i = 0; i < cursorSpace.size(); i++)
cursorSpace[i].next = i + 1;
cursorSpace[cursorSpace.size() - 1].next = 0;
cursorSpaceIsInitialized = true;
}
}
//分配结点
template <class Object>
int CursorList<Object>::alloc()
{
int p = cursorSpace[0].next;
cursorSpace[0].next = cursorSpace[p].next;
return p;
}
//释放结点
template <class Object>
void CursorList<Object>::free(int p)
{
cursorSpace[p].next = cursorSpace[0].next;
cursorSpace[0].next = p;
}
//构造静态表
template <class Object>
CursorList<Object>::CursorList()
{
initializeCursorSpace();
header = alloc();
cursorSpace[header].next = 0;
}
//逻辑判空
template <class Object>
bool CursorList<Object>::isEmpty() const
{
return cursorSpace[header].next == 0;
}
//在p所指向单元后插入x
template <class Object>
void CursorList<Object>::insert(const Object & x, const CursorListItr<Object> & p)
{
if (p.current != 0)
{
int pos = p.current;
int tmp = alloc();
cursorSpace[tmp] = CursorNode(x, cursorSpace[pos].next);
cursorSpace[pos].next = tmp;
}
}
//返回值为x的第一个结点
template <class Object>
CursorListItr<Object> CursorList<Object>::find(const Object & x) const
{
int itr = cursorSpace[header].next;
while (itr != 0 && cursorSpace[itr].element != x)
itr = cursorSpace[itr].next;
return CursorListItr<Object>(itr);
}
//返回值为x的第一个结点的前驱
template <class Object>
CursorListItr<Object> CursorList<Object>::findPrevious(const Object & x) const
{
int itr = header;
while (cursorSpace[itr].next != 0&&cursorSpace[cursorSpace[itr].next].element != x)
itr = cursorSpace[itr].next;
return CursorListItr<Object>(itr);
}
//删除第一个值为 x的元素
template <class Object>
void CursorList<Object>::remove(const Object & x)
{
CursorListItr<Object> p = findPrevious(x); //查找前驱
int pos = p.current;
if (cursorSpace[pos].next != 0)
{
int tmp = cursorSpace[pos].next;
cursorSpace[pos].next = cursorSpace[tmp].next;
free (tmp);
}
}