模擬STL連結串列類的實現

williamking5發表於2015-08-05

模擬STL連結串列類的實現

STL內部定義了多種容器和迭代器,方便了資料結構類的使用,且不需關注內部原始碼。為了方便個人使用習慣,我又重寫了一個連結串列類,作為學C++後的第一個專案作業。我將其命名為clist。

程式碼及註釋

cpp       /*
        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;}
        };

相關文章