模拟STL中的list类

/*
clist是一个链表类,而_clist是链表的一个单元,iter是一个迭代器(与STL模板库用法相同)。
clist的成员函数:
    int:getnum()返回clist中的单元数量。
    _clist*:add()在clist结尾添加一个单元,但data为初始值。
    _clist*:add(Type x)在clist结尾添加一个单元,且该单元data为x。
    _clist*:add(_clist* p,Type x)在p后添加一个单元,且该单元data为x,如果p为NULL则在开头添加。
    _clist*:add(_clist* p)在p后添加一个单元但该单元data为初始值。
    void:del(clist* p)删除p指向的元素。
    void:del()删除整个链表的所有元素。
    _clist*:next(_clist* p)返回p的下个单元。
    _clist*:prev(_clist* p)返回p的上个单元。
    void:putdata(_clist* p,Type x)将x赋给p指向的单元的data。
    void:putsymbol(_clist*p,int x)将x赋给p指向的单元的symbol。
    T:data(_clist* p)返回p指向的单元的data值。
    int:symbol(_clist*p)返回p指向单元的symbol值。
    不建议使用未列出的函数。
_clist的变量说明:
    _clist* next:该单元的下个单元。
    _clist* prev:该单元的上个单元。
    T data:该单元的数据值。
    int symbol:该单元的标记值。
iter的使用说明:
    iter ++:可以使迭代器从现在位置移向下一位置。
    iter --:可以使迭代器从现在位置移向上一位置。
    _clist<T>* &:返回迭代器现在指向的地址。
    void =(_clist<T>* P):使迭代器指向一个单元的地址。
    bool ==,!=:判断迭代器的指向地址与另一_clist<T>*地址是否相同。
    T *:返回迭代器现在的data值。
    void <<T x:将一个值x赋给现在迭代器指向单元的data。
*/
#include<stddef.h>
template <typename T>
class _clist{
    public:
          T data;
        _clist* next;
        _clist* prev;
        int symbol;
        _clist(){
            next=NULL;
            prev=NULL;
            symbol=0;
        }
};
template <typename T>
class iter{
    _clist<T>* thepointer;
    public:
          T data;
          bool eol,bol;
        _clist<T>* next;
        _clist<T>* prev;
        int symbol;
        iter(){
            next=NULL;
            prev=NULL;
            symbol=0;
            thepointer=NULL;
            eol=0;
            bol=0;
        }

          iter<T> operator ++(int){
        if (next==NULL) {eol=1;thepointer=NULL;return *this;}
        prev=(*next).prev;
        symbol=(*next).symbol;
        data=(*next).data;
        thepointer=next;
        next=(*next).next;
        return *this;
        }
        iter<T> operator --(int){
        if (prev==NULL) {bol=1;thepointer=NULL;return *this;}
        next=(*prev).next;
        symbol=(*prev).symbol;
        data=(*prev).data;
        thepointer=prev;
        prev=(*prev).prev;
        return *this;
        }
        bool operator =(_clist<T> *p){
            if (p==NULL) return 1;
            data=(*p).data;
            next=(*p).next;
            prev=(*p).prev;
            symbol=(*p).symbol;
            thepointer=p;
            bol=eol=0;
            return 0;
        }
        bool operator ==(_clist<T>* p){
            if (p==thepointer) return 1;
            else return 0;
        }
        bool operator !=(_clist<T>* p){
            if (p==thepointer) return 0;
            else return 1;
        }
        T operator *(){
            return data;
        }
        _clist<T>* operator &(){
            return (thepointer);
        }
        void operator <<(T x){
            (*thepointer).data=x;
        }
};
template <typename T>
class clist{
public:
    _clist<T> *head,*tail;
    _clist<T> *lastp;
    int num;
        clist(){
            head=NULL;
            tail=NULL;
            num=0;
        }
        int getnum(){
            _clist<T> *pp;
            pp=head;
            int n=0;
            while (pp!=NULL){
                n++;
                pp=(*pp).next;
            }
            return n;
        }
        clist(_clist<T>& h){
            head=&h;
            num=getnum();
            _clist<T> *pp=head;
            while ((*pp).next!=NULL)
                pp=(*pp).next;
            tail=pp;
        }
    _clist<T>* add(){
        _clist<T>* object2=new _clist<T>;
        _clist<T>* object1=gettail();
        if (object1!=NULL) {
            _clist<T>* t;
            t=(*object1).next;
            (*object1).next=object2;
            (*object2).prev=object1;
            (*object2).next=t;
            if (t!=NULL) (*t).prev=object1;
            num=getnum();
            if ((*object2).next==NULL) tail=object2;
        }
        else{
            _clist<T>* t=head;
            (*object2).next=t;
            (*object2).prev=NULL;
            if (t!=NULL) (*t).prev=object2;
            head=object2;
            if (tail==NULL) tail=object2;
            num=getnum();
        }
        return object2;
    }
    _clist<T>* add(T data){
        _clist<T>* object2=new _clist<T>;
        (*object2).data=data;
        _clist<T>* object1=tail;
        if (object1!=NULL) {
            _clist<T>* t;
            t=(*object1).next;
            (*object1).next=object2;
            (*object2).prev=object1;
            (*object2).next=t;
            if (t!=NULL) (*t).prev=object1;
            num=getnum();
            if ((*object2).next==NULL) tail=object2;
        }
        else{
            _clist<T>* t=head;
            (*object2).next=t;
            (*object2).prev=NULL;
            if (t!=NULL) (*t).prev=object2;
            head=object2;
            if (tail==NULL) tail=object2;
            num=getnum();
        }
        return object2;
    }
    _clist<T>* add(iter<T>& object){
        _clist<T>* object1=&(object);
        _clist<T>* object2=new _clist<T>;
        if (object1!=NULL){
            _clist<T>* t;
            t=(*object1).next;
            (*object1).next=object2;
            (*object2).prev=object1;
            (*object2).next=t;
            if (t!=NULL) (*t).prev=object1;
            num=getnum();
            if ((*object2).next==NULL) tail=object2;
        }
        else{
            _clist<T>* t=head;
            (*object2).next=t;
            (*object2).prev=NULL;
            if (t!=NULL) (*t).prev=object2;
            head=object2;
            if (tail==NULL) tail=object2;
            num=getnum();
        }
        return object2;
    }
    _clist<T>* add(iter<T> object,T data){
        _clist<T> *object1=&object;
        _clist<T>* object2=new _clist<T>;
        (*object2).data=data;
        if (object1!=NULL){
            _clist<T>* t;
            t=(*object1).next;
            (*object1).next=object2;
            (*object2).prev=object1;
            (*object2).next=t;
            if (t!=NULL) (*t).prev=object1;
            num=getnum();
            if ((*object2).next==NULL) tail=object2;
        }
        else{
            _clist<T>* t=head;
            (*object2).next=t;
            (*object2).prev=NULL;
            if (t!=NULL) (*t).prev=object2;
            head=object2;
            if (tail==NULL) tail=object2;
            num=getnum();
        }
        return object2;
    }
    void del(_clist<T> *object){
        if (object==lastp) lastp=NULL;
        if (object==head) head=(*object).next;
        if (object==tail) tail=(*object).prev;
        _clist<T> *i=(*object).prev,*j=(*object).next;
        if (i!=NULL) (*i).next=j;
        if (j!=NULL) (*j).prev=i;
        delete object;
    }
    void del(){
        _clist<T>* p=init();
        _clist<T>* i=p;
        p=next();
        while (p!=NULL){
            delete i;
            i=p;
            p=next();
        }
        head=tail=NULL;
        delete i;
    }
    _clist<T>* next(_clist<T>* pp){
        if (pp==NULL) return NULL;
        else {
            _clist<T>* hehe=(*pp).next;
            return hehe;
        }
    }
    _clist<T>* prev(_clist<T> *pp){
        if (pp==NULL) return NULL;
        else {
            _clist<T>* hehe=(*pp).prev;
            return hehe;
        }
    }
    void movep(_clist<T>* p){
        lastp=p;
    }
    _clist<T>* init(){
        lastp=gethead();
        return lastp;
    }
    void putdata(_clist<T>*p,T data){
        (*p).data=data;
    }
    void putsymbol(_clist<T>*p,int symbol){
        (*p).symbol=symbol;
    }
    T data(_clist<T>*p){return (*p).data;}
    int symbol(_clist<T>*p){return (*p).symbol;}
    _clist<T> gethead(){return *head;}
    _clist<T> gettail(){return *tail;}
};


转载于:https://my.oschina.net/u/2430895/blog/488432

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值