#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;
}