• 链表


    template <class Elem> 
    //单链表
    class Link

    {
    public:
    Elem element;
    Link *next;
    Link(const Elem& elemval,link *nextval=NULL)
    {
    element=elemval; next=nextval;
    }
    Link(Link * nextval=NULL)
    {
    next=nextval;
    }
    };
    template <class Elem>
    class LList:public List<Elem>
    {
    private:
    Link<Elem>* head;
    Link<Elem>* tail;
    Link<Elem>* fence;
    int leftcnt;
    int rightcnt;
    void init()
    {
    fence=tail=head=new Link<Elem>;
    leftcnt=rightcnt=0;
    }
    void removeall()
    {
    while(head!=NULL)
    {
    fence=head;
    head=head->next;
    delete fence;
    }
    }
    public:
    LList(int size=DefaultListSize)
    {
    init();
    }
    ~LList()
    {
    removeall();
    }
    void clear()
    {
    removeall(); init();
    }
    bool insert(const Elem&);
    bool append(const Elem&);
    bool remove(Elem &);
    void setStart()
    {
    fence=head;rightcnt+=leftcnt;leftcnt=0;
    }
    void setEnd()
    {
    fence=tail;leftcnt+=rightcnt;rightcnt=0;
    }
    void prev();
    void next()
    {
    if(fence!=tail)
    {
    fence=fence->next;rightcnt--;leftcnt++;
    }
    }
    int leftLength() const
    {
    return leftcnt;
    }
    int rightlength const
    {
    return rightcnt;
    }
    bool setPos(int pos);
    bool getValue(Elem & it) const
    {
    if(rightLength()==0)
    return false;
    it=fence->next->element;
    return true;
    }
    void print() const;
    };

    template <class Elem>
    bool LList<Elem>::insert(const Elem& item)
    {
    fence->next=new Link<Elem>(item,fence->next);
    if(tail==fence) tail=fence->next;
    rightcnt++;
    return true;
    }

    template <class Elem>
    bool LList<Elem>::append(const Elem& item)
    {
    tail=tail->next=new Link<Elem>(item,NULL);
    rightcnt++;
    return true;
    }

    template <class Elem>
    bool LList<Elem>::remove(Elem & it)
    {
    if(fence->next==NULL) return false;
    it=fence->next->element;
    Link<Elem> *ltemp=fence->next;
    fence->next=ltemp->next;
    if(tail==ltemp) tail=fence;
    delete ltemp;
    rightcnt--;
    return true;
    }

    template <class Elem>
    void LList<Elem>::prev()
    {
    Link<Elem> * temp=head;
    if(fence==head) return;
    while(temp->next!=fence) temp=temp->next;
    fence=temp;
    leftcnt--;rightcnt++;
    }

    template <class Elem>
    bool LList<Elem>::setPos(int pos)
    {
    if((pos<0)||(pos>rightcnt+leftcnt)) return false;
    fence=head;
    for(int i=0;i<pos;i++)
    fence=fence->next;
    return true;
    }
    template <class Elem>
    void LList<Elem>::print() const
    {
    Link<Elem>* temp=head;
    cout<<"< ";
    while(temp!=fence)
    {
    cout<<temp->next->element<<"";
    temp=temp->next;
    }
    cout<<"| ";
    while(temp->next!=NULL)
    {
    cout<<temp->next->element<<"";
    temp=temp->next;
    }
    cout<<">\n";
    }


    template <class Elem>
    class DLink //双链表的节点表达类
    {

    private:
    static DLink<Elem> *freelist;
    public:
    Elem element;
    DLink *next;
    DLink *prev;
    link(const Elem& e,DLink* prevp=NULL,DLink* nextp=NULL)
    {
    element=e;prev=prevp; next=nextp;
    }
    DLink(DLink *prevp=NULL,DLink* nextp=NULL)
    {
    prev=prevp; next=nextp;
    }
    void *operator new(size_t);
    void operator delete(void*);
    }; ////

    template <class Elem>
    DLink<Elem> *DLink<Elem>::freelist=NULL;

    template<class Elem>
    void *DLink<Elem>::operator new(size_t)
    {
    if(freelist==NULL) return ::new DLink;
    DLink<Elem> *temp=freelist;
    freelist=freelist->next;
    return temp;
    }

    template<class Elem>
    void DLink<Elem>::operator delete(void *ptr)
    {
    ((DLink<Elem>*)ptr)->next=freelist;
    freelist(Link<Elem>*ptr);
    }


    //双链表中某些函数的实现
    template <class Elem>

    class DList:public list<Elem>
    {
    private:
    DLink<Elem> *head;
    DLink<Elem> *tail;
    DLink<Elem> *fence;
    int leftcnt;
    int rightcnt;
    public:
    bool insert(const Elem&);
    bool append(const Elem&);
    bool remove(Elem&);
    void prev();
    };

    template <class Elem>
    bool DList<Elem>::insert(const Elem& item)
    {
    fence->next=new DLink<Elem>(item,fence,fence->next);
    if(fence->next->next!=NULL)
    fence->next->next->prev=fence->next;
    if(tail==fence)
    tail=fence->next;
    rightcnt++;
    return true;
    }

    template <class Elem>
    bool DList<Elem>::append(const Elem& item)
    {
    tail=tail->next=new DLink<Elem>(item,tail,NULL);
    rightcnt++;
    return true;
    }

    template <class Elem>
    bool DList<Elem>::remove(Elem& it)
    {
    if(fence->next==NULL)
    return false;
    it=fence->next->element;
    DLink<Elem>* ltemp=fence->next;
    if(ltemp->next!=NULL)
    ltemp->next->prev=fence;
    else tail=fence;
    fence->next=ltemp->next;
    delete ltemp;
    rightcnt--;
    return true;
    }

    template<class Elem>
    void DList<Elem>::prev()
    {
    if(fence!=head)
    {
    fence=fence->prev;leftcnt--;rightcnt++;
    }
    }
    Live together,or Die alone!
  • 相关阅读:
    Java基础97 json插件的使用(java对象和json字符串对象之间的转换)
    rman checksyntax和解决RMAN-01009: syntax error: found "dot"
    oracle partition table 分区表详解
    RMAN.DBMS_RCVCAT 版本错误处理
    PSU/OPATCH/OJVM下载页面及安装方式(最实用版)
    12.2RAC搭建记录
    主备归档不一致导致的RMAN-08137无法清理归档解决方案
    Oracle 锁的等级
    表数据压缩
    OLTP/OLAP
  • 原文地址:https://www.cnblogs.com/hzhida/p/2354748.html
Copyright © 2020-2023  润新知