-
链表、链类与遍历器 - [C++]
2008-05-03
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://sundry.blogbus.com/logs/20177958.html
template<class T> class Iterator{
public:
virtual int init()=0;
virtual int operator ++(int)=0;
virtual int operator !()=0;
virtual T operator ()()=0;
//virtual void operator =(T newvalue)=0;
};
template <class T> class Link;
template<class T> class ListIterator;
template <class T> class List;
template <class T> class List{
public:
List();
void add(T value);
List(const List<T>& source);
void deleteAllvalue();
List<T>* duplicate() const;
virtual ~List(){
deleteAllvalue();
}
virtual Link<T>* includes(T value) const;
private:
Link<T>* p1stLink;
friend class Link<T>;
friend class ListIterator<T>;
};
template<class T> Link<T>* List<T>::includes(T value) const{
for(Link<T>* p=p1stLink;p;p=p->pNextLink){
if(p->value==value)
return p;
}
return 0;
}
template<class T> void List<T>::add(T value){
p1stLink= new Link<T>(value,p1stLink);
}
template<class T> List<T>* List<T>::duplicate() const{
List<T>* newlist;
newlist = new List<T>;
if(p1stLink)
newlist->p1stLink=p1stLink->duplicate();
else
newlist->p1stLink=0;
return newlist;
}
template<class T> List<T>::List():p1stLink(0){}
template<class T> List<T>::List(const List<T>& source){
if(source.p1stLink)
p1stLink=source.p1stLink->duplicate();
else
p1stLink=0;
}
template<class T> void List<T>::deleteAllvalue(){
Link<T>* next;
for(Link<T>* i=p1stLink;i;i=next){
next = i->pNextLink;
i->pNextLink=0;
delete i;
}
}
template <class T> class Link{
public:
Link<T>* insert(T value);
private:
Link(T linkValue,Link<T>* pNext);
Link(const Link<T>& source);
Link<T>* duplicate() const;T value;
Link<T>* pNextLink;
friend class List<T>;
friend class ListIterator<T>;
};
template<class T> Link<T>* Link<T>::insert(T value){
pNextLink=new Link(value,pNextLink);
return pNextLink;
}
template<class T> Link<T>* Link<T>::duplicate() const{
Link<T>* newlink;
if(pNextLink!=0)
newlink= new Link<T>(value,pNextLink->duplicate());
else
newlink=new Link<T>(value,0);
return newlink;
}
template<class T> Link<T>::Link(T linkValue,Link<T>* pNext):value(linkValue),pNextLink(pNext){
}
template<class T> Link<T>::Link(const Link<T>& source):value(source.value),pNextLink(source.pNextLink){
}template<class T> class ListIterator: public Iterator<T>{
public:
virtual int init();
ListIterator<T>(List<T>& refList);
virtual int operator ++(int);
virtual int operator !();
virtual T operator ()();
virtual void operator =(T newvalue);int includes(T value);
void addBefore(T value);
void addAfter(T value);
void removeCurrent();
private:
Link<T>* currentLink;
List<T>& source;
Link<T>* previousLink;
};
template<class T> int ListIterator<T>::init(){
currentLink = source.p1stLink;
previousLink =0;
return operator !();
}
template<class T> ListIterator<T>::ListIterator(List<T>& refList):source(refList){
init();
}
template<class T> int ListIterator<T>::operator ++(int){
if(currentLink)
{
previousLink = currentLink;
currentLink = currentLink->pNextLink;
}
else
{
if(previousLink){
currentLink = previousLink->pNextLink;
}
else
{currentLink = source.p1stLink;
}
}
return operator !();
}
template<class T> int ListIterator<T>::operator !(){
if(currentLink)
return 1;
else
{
if(previousLink)
return previousLink->pNextLink!=0;
else
return source.p1stLink!=0;
}
}
template<class T> T ListIterator<T>::operator ()(){
if(!currentLink)
throw 1;
return currentLink->value;
}
template<class T> void ListIterator<T>::operator =(T newvalue){
if(!currentLink)
throw 1;
currentLink->value=newvalue;
}
template<class T> void ListIterator<T>::addBefore(T value){
if(previousLink){
previousLink=previousLink->insert(value);
}
else{
source.add(value);
previousLink = source.p1stLink;
}
}
template<class T> void ListIterator<T>::addAfter(T value){
if(currentLink)
currentLink->insert(value);
else
if(previousLink){
previousLink->insert(value);
}
else
source.add(value);
}template<class T> void ListIterator<T>::removeCurrent(){
if(!currentLink)
throw 1;
if(previousLink)
previousLink->pNextLink=currentLink->pNextLink;
else
source.p1stLink = currentLink->pNextLink;
delete currentLink;
currentLink = 0;
}
template<class T> int ListIterator<T>::includes(T value){
currentLink=source.includes(value);
for(init();currentLink;operator ++(1)){
if(currentLink->value==value)
return 1;
}
return 0;
};
int main(){
try{
List<int> list;
ListIterator<int> li(list);
for(int i=0;i<9;i++){
li.init();li.addAfter(i);
cout<<i<<endl;
}
//012345678
cout<<endl<<li.includes(8)<<"#"<<endl;
cout<<li();
//cout<<li();
}
catch(int err)
{
if(err=1)
cout<<"错误,当前节点为空";
}getchar();
return 0;
}随机文章:
讨厌出差 2009-11-04their lives inhaled asbestos dus 2009-11-04营销爱好者常说的经典黄段子 2008-05-10插入排序法 2008-04-29快速排序法(Quick Sort) 2008-04-24
收藏到:Del.icio.us







