马牛不是人

学姐说:“学习学习不后退”

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#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() == 0return 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 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
<intint>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;
}


元素的比较本来要用一个类来比较,我懒得写了,就用了==来比。要注意。
posted on 2006-06-22 21:23  马牛  阅读(1078)  评论(0编辑  收藏  举报