⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listiterator.h

📁 vc当中比较容易遇到的过河问题
💻 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 + -