码迷,mamicode.com
首页 > 其他好文 > 详细

实现含iterator的双向链表

时间:2016-07-18 05:39:14      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:c++

#pragma once

template<class T>
struct __ListNode
{
	__ListNode<T>* _next;
	__ListNode<T>* _prev;
	T _data;

	__ListNode(const T& x = T())
		:_next(NULL)
		,_prev(NULL)
		,_data(x)
	{}

};

template<class T, class Ref, class Ptr>
struct __ListIterator
{
	typedef __ListIterator<T, Ref, Ptr> Self;
	typedef T ValueType;
	typedef Ref Reference;
	typedef Ptr Pointer;

	//////////////////////////////////////////////////////////////////////////
	__ListNode<T>* _node;
	//////////////////////////////////////////////////////////////////////////
	
	__ListIterator()
	{}

	__ListIterator(__ListNode<T>* x)
		:_node(x)
	{}

	bool operator==(const Self& s)
	{
		return _node == s._node;
	}

	bool operator!=(const Self& s)
	{
		return _node != s._node;
	}

	Reference operator*()
	{
		return _node->_data;
	}

	//前置++
	Self& operator++()
	{
		_node = _node->_next;
		return *this;
	}

	//后置++
	Self operator++(int)
	{
		Self tmp(*this);
		_node = _node->_next;
		return tmp;
	}

	//前置--
	Self& operator--()
	{
		_node = _node->_prev;
		return *this;
	}

	//后置--
	Self operator--(int)
	{
		Self tmp(*this);
		_node = _node->_prev;
		return tmp;
	}

};

template<class T>
class List
{
public:
	typedef __ListNode<T> ListNode;
	typedef __ListIterator<T, T&, T*> Iterator;

	List()
	{
		_head = new ListNode;
		_head->_next = _head;
		_head->_prev = _head;
	}

	void Insert(Iterator pos, const T& x)
	{
		ListNode* cur = pos._node;
		ListNode* prev = cur->_prev;

		ListNode* tmp = new ListNode(x);
		prev->_next = tmp;
		tmp->_next = cur;

		tmp->_prev = prev;
		cur->_prev = tmp;
	}

	void PushBack(const T& x)
	{
		Insert(End(), x);
	}

	void PushFront(const T& x)
	{
		Insert(Begin(), x);
	}

	void PopBack()
	{
		Erase(--End());
	}

	Iterator Erase(Iterator pos)
	{
		assert(!pos.End());

		ListNode* prev = pos._node->_prev;
		ListNode* next = pos._node->_next;

		prev->_next = next;
		next->_prev = prev;

		delete pos._node;

		return Iterator(next);
	}

	Iterator Begin()
	{
		return Iterator(_head->_next);
	}

	Iterator End()
	{
		return Iterator(_head);
	}


protected:
	ListNode* _head;
};

void Test()
{
	List<int> list;

	list.PushBack(1);
	list.PushBack(2);
	list.PushBack(3);
	list.PushBack(4);

	List<int>::Iterator it = list.Begin();
	while (it != list.End())
	{
		*it = 10;
		cout<<*it<<" ";
		++it;
	}
	cout<<endl;
}


本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1827263

实现含iterator的双向链表

标签:c++

原文地址:http://zgw285763054.blog.51cto.com/11591804/1827263

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!