#include <iostream>
using namespace std;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
class empty
{
};
![](/Images/OutliningIndicators/None.gif)
//sngly-linked list node
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
template <class Elem> class Link
{
public:
Elem element; //value for this node
Link *next;
Link(const Elem& elemval, Link * nextval =NULL)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{element = elemval; next = nextval; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Link(Link* nextval = NULL)
{ next = nextval; }
};
![](/Images/OutliningIndicators/None.gif)
//linked list implementation
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
template <class Elem> class LList: public Link<Elem>
{
private:
Link<Elem>* head;
Link<Elem>* tail;
Link<Elem>* fence;
int leftcnt;
int rightcnt;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
void init()
{
fence = tail = head = new Link<Elem>;
leftcnt = rightcnt = 0;
}
public:
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
void removeall()
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while(head != NULL)
{
fence = head;
head = head->next;
delete fence;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
LList(int size = 10)
{init(); }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
~LList()
{removeall();}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
void clear()
{removeall();init(); }
bool insert (const Elem&);
bool append(const Elem&);
bool remove(Elem&);
void setStart()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//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()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ fence = tail; leftcnt +=rightcnt; rightcnt = 0; }
void prev();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
void next()
{
if (fence != tail )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ fence = fence->next; rightcnt--; leftcnt++; }
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
int leftLength() const
{ return leftcnt; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
int rightLength() const
{ return rightcnt; }
bool setPos (int pos);
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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;
};
![](/Images/OutliningIndicators/None.gif)
template <class Elem>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
bool LList<Elem>::append(const Elem& item)
{
tail = tail->next = new Link<Elem>(item,NULL);
rightcnt++;
return true;
}
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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;
}
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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++;
}
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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;
}
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
template <class Elem> void LList<Elem>::print() const
{
Link<Elem>* temp = head;
cout<<"< ";
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while(temp != fence)
{
cout<<temp->next->element<<" ";
temp = temp->next;
}
cout<<"| ";
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while(temp->next != NULL)
{
cout<<temp->next->element<<" ";
temp = temp->next;
}
cout<<">\n";
};
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
template <class Key ,class Elem>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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;
};
![](/Images/OutliningIndicators/None.gif)
template <class Key ,class Elem>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
class LListDict: public Dictionary<Key,Elem>
{
public:
LList<Elem>* list;
public:
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
LListDict( int size = 10 )
{ list = new LList<Elem>; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
~LListDict()
{ list->removeall(); }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
void clear()
{ list->clear(); }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
bool insert(const Elem& e)
{ return list->append(e); }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
bool remove(const Key& K, Elem& e)
{
for(list->setStart(); list->getValue(e); list->next() )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(K == e)
{ list->remove(e);return true; }
return false;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
bool removeAny(Elem& e)
{
if(size()==0)return false;
list->setEnd();
list->prev();
list->remove(e);
return true;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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() )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//cout<<"k="<<K<<";e="<<e<<endl;
if(K == e )return true;
}//for
return false;
}
int size()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ return list->leftLength()+list->rightLength(); }
![](/Images/OutliningIndicators/InBlock.gif)
};
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
int main()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
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;
![](/Images/OutliningIndicators/InBlock.gif)
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
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
system("pause");
return 0;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
元素的比较本来要用一个类来比较,我懒得写了,就用了==来比。要注意。