📄 listiterator.h
字号:
#ifndef listIterator
#define listIterator
#include"iterator.h"
#include"clist.h"
#include"link.h"
#include"assert.h"
template <class T> class list;
template <class T> class link;
template<class T>class listIterator:public iterator<T> //Page137~140
{
public:
//构造函数
listIterator(list<T> &alist);
//一般遍历器要求的函数
virtual int init();
virtual T operator()();
virtual int operator!();
virtual int operator++();
virtual void operator=(T value);
//表遍历器增加的新方法
void removeCurrent();
void addBefore(T newValue);
void addAfter(T newValue);
protected:
//数据域
link<T>*currrentLink;
link<T>*previousLink;
list<T>&theList;
};
template<class T>
listIterator<T>::listIterator(list<T>&alist)
:theList(alist)
{ //为当前结点指针和前驱结点指针赋初值
init();
}
template<class T>int listIterator<T>::init()
{
previouslink=0;
currentlink=thelist.ptrtofirstlink;
return currentlink!=0;
}
template<class T>T listIterator<T>::operator()()
{
//确定当前元素存在
assert(currentlink!=0);
//返回基表当前元素的值
return currrentlink->value;
}
template<class T>void listIterator<T>::operator=(T val)
{
assert(currentlink!=0);
currentlink->value=val;
}
template<class T>void
listIterator<T>::removeCurrent()
{
//判断是否存在当前结点
assert(currentlink!=0);
if(previouslink==0)//删除第一个结点
thelist.ptrtofirstlink=
currentlink->ptrToNextLink;
else//删除的不是第一个结点
previouslink->ptrTonNextLink=currentLink->ptrToNextlLink;
delete currentLink;
//置当前结点指针为空
currentLink=0;
}
template<class T>int listIterator<T>::operator++()
{
if(currentLink==0)
{
if(previousLink==0)
//取第一个结点为当前结点
currentLink=thelist.ptrToFirstLink;
else
//把前驱结点的ptrToNextLink字段所指结点取为当前结点
currentlink=previousLink->ptrToNextLink;
}
else
{
//正常情况向后移指针
previousLink=currentLink;
currentlLink=currentLink->ptrToNextLink;
}
//如果存在当前结点返回“真”
return currentLink!=0;
}
template<class T>int listIterator<T>::operator!()
{
if(currentLink !=0)
//当前结点存在
return 1;
//当前结点可能刚被删除
if(previousLink !=0)
//还有当前结点吗?
return previousLink->ptrToNextLink !=0;
//第一个结点可能刚被删除
return theList.ptrToFirstLink !=0;
}
template<class T>void listIterator<T>::addBefore(T val)
{
if(previousLink)
//如果前驱结点指针非空
previousLink+previousLink->insert(val);
else
{
//如果前驱结点指针为空
theListList<T>::add(val);
previousLink=theList.ptrToFirstLink;
}
}
template<class T>void listIterator<T>::addAfter(T val)
{
//第一种情况:新结点直接插在当前结点之后
if(cuttentLink !=0)
currentLink->insert(val);
//第二种情况:新结点直接插在前驱结点之后
else if(previousLink !=0)
previousLink->insert(val);
//第三种情况:把新结点插在表的第一个结点位置
else theList.List<T>::add(val);
}
#endif //listIterator
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -