用无序链表实现字典ADT(C++描述)

#include <iostream>
using namespace std;

class empty ...{
      };

//sngly-linked list node
template <class Elem> class Link ...{
public:
    Elem element; //value for this node
    Link *next;
    Link(const Elem& elemval, Link * nextval =NULL)
    ...{element = elemval; next = nextval; }
    Link(Link* nextval = NULL) ...{ next = nextval; }
};

//linked list implementation
template <class Elem> class LList: public Link<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;
             }
public:
       void removeall() ...{
             while(head != NULL) ...{
                        fence = head;
                        head = head->next;
                        delete fence;
                        }
             }

       LList(int size = 10) ...{init(); }
       ~LList() ...{removeall();}
       void clear() ...{removeall();init(); }
       bool insert (const Elem&);
       bool append(const Elem&);
       bool remove(Elem&);
       void setStart()
       ...{
           //cout<<"in setStart rightcnt="<<rightcnt<<";leftcnt="<<leftcnt<<endl;
           fence = head ; rightcnt += leftcnt; leftcnt = 0;
           //cout<<"at the end of setStart

rightcnt="<<rightcnt<<";leftcnt="<<leftcnt<<endl;
       }
       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...{     //let e = fence's element
       //cout<<"inLList out rightLength"<<rightLength()<<endl;  //try
            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<<"> ";
};

 


template <class Key ,class Elem>
class Dictionary ...{
public:
       virtual void clear()= 0;
       virtual bool insert(const Elem&) = 0;
       virtual bool remove(const Key&, Elem&) = 0;
       virtual bool removeAny(Elem&) = 0;
       virtual bool find(const Key&, Elem&) const =0;
       virtual int size() = 0;
};

template <class Key ,class Elem>
class LListDict: public Dictionary<Key,Elem> ...{
public:
        LList<Elem>* list;
public:
       LListDict( int  size = 10 ) ...{ list = new LList<Elem>; }
       ~LListDict() ...{ list->removeall(); }
       void clear() ...{ list->clear(); }
       bool insert(const Elem& e) ...{ return list->append(e); }
       bool remove(const Key& K, Elem& e) ...{
            for(list->setStart(); list->getValue(e); list->next() )
                                  if(K == e)...{ list->remove(e);return true; }
                                  return false;  
            }
       bool removeAny(Elem& e) ...{
            if(size()==0)return false;
            list->setEnd();
            list->prev();
            list->remove(e);
            return true;           
            }
       bool find(const Key& K,Elem& e)const ...{
            //list->getValue(e);
            //cout<<"e="<<e;
            //cout<<"rightcnt="<<list->rightLength()<<endl;
           
            for(list->setStart(); list->getValue(e); list->next() )
            ...{
                                  //cout<<"k="<<K<<";e="<<e<<endl;
                                  if(K == e )return true;
            }//for
            return false;
            }
       int size()
       ...{ return list->leftLength()+list->rightLength(); }
      

};

 

 

int main()
...{
    LListDict<int, int>LDmanio;
   
    //add link
    for(int i = 0; i < 100; i++) 
    LDmanio.insert(i);
       cout<<":::::::::::::::::::::::orginal list::::::::::::::::::::::::"<<endl;
    LDmanio.list->print();  //output the llist
   
   
    int K=23,e;

    cout<<"find()="<<LDmanio.find(K,e)<<endl;
   
    //remove
    LDmanio.remove(K,e);
    cout<<":::::::::::::::::::::::remove done:::::::::::::::::::::::::"<<endl;
    LDmanio.list->print();  //output the llist
    //removeany
    LDmanio.removeAny(e);
    cout<<"::::::::::::::::::::::removeany done:::::::::::::::::::::::"<<endl;
    LDmanio.list->print();  //output the llist
    //size()
    cout<<"size()="<<LDmanio.size()<<endl;
    //clear()
    LDmanio.clear();
    cout<<":::::::::::::::::::::::clear done:::::::::::::::::::::::::::"<<endl;
    LDmanio.list->print();  //output the llist

 

   
   
    system("pause");
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值