静态链表

来源:互联网 发布:linux运维之道 百度云 编辑:程序博客网 时间:2024/06/08 19:07

使用游标(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所指向单元后插入xtemplate <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);    }}


0 0
原创粉丝点击