利用模板类迭代器实现链表
来源:互联网 发布:财神软件 编辑:程序博客网 时间:2024/06/05 14:22
//#pragma once#include <iostream>using namespace std;template<class T>struct ListNode{ ListNode(const T& data = T()) : _pPre(0) , _pNext(0) , _data(data) {} ListNode<T>* _pPre; ListNode<T>* _pNext; T _data;};template<class T, class Ref, class Ptr> //模板template<class T,class T&,class T*)class ListIterator //迭代器{ typedef ListIterator<T, Ref, Ptr> Self;public: ListIterator() : _pCur(0) {} ListIterator(ListNode<T>* pCur) : _pCur(pCur) {} ListIterator(const Self& s) : _pCur(s._pCur) {} Ref operator*()//返回data { return _pCur->_data; } Ptr operator->()//返回对象的地址 { return &(operator*()); //return &(_pCur->_data); } Self& operator++()//前置++ { _pCur = _pCur->_pNext; return*this; } Self operator++(int)//后置++ { Self temp(*this); _pCur = _pCur->_pNext; return temp; } Self& operator--()//前置-- { _pCur = _pCur->_pPre; return*this; } Self operator--(int)//后置-- { Self temp(*this); _pCur = _pCur->_pPre; return temp; } bool operator!=(const Self& s) { return _pCur != s._pCur; } bool operator==(const Self& s) { return _pCur == s._pCur; } ListNode<T>* _pCur;};template<class T>class List{public: typedef ListIterator<T, T&, T*> Iterator; typedef ListNode<T> Node;public: List() : _pHead(new Node) { _pHead->_pNext = _pHead; _pHead->_pPre = _pHead; } // 1 2 3 4 5 List(const T* array, size_t size)//带参数的构造函数 : _pHead(new ListNode<T>) { _pHead->_pNext = _pHead; _pHead->_pPre = _pHead; for (size_t i = 0; i < size; ++i) PushBack(array[i]); } List(const List<T>& l); List<T>& operator=(const List<T>& l); ~List() { Clear(); delete _pHead; _pHead = NULL; } ///////////////////////////////////////////////////// Iterator Begin() { return Iterator(_pHead->_pNext); } Iterator End() { return Iterator(_pHead); } /////////////////////Modify////////////////////////// void PushBack(const T& data) { ListNode<T>* pNewNode = new ListNode<T>(data); // 空链表 if (Empty()) { _pHead->_pNext = pNewNode; pNewNode->_pNext = _pHead; pNewNode->_pPre = _pHead; _pHead->_pPre = pNewNode; } else { ListNode<T>* pTail = _pHead->_pPre; pTail->_pNext = pNewNode; pNewNode->_pPre = pTail; pNewNode->_pNext = _pHead; _pHead->_pPre = pNewNode; } } void PopBack() { if (Empty()) return; else { ListNode<T>* pTail = _pHead->_pPre->_pPre; delete pTail->_pNext; pTail->_pNext = _pHead; _pHead->_pPre = pTail; } } void PushFront(const T& data) { ListNode<T>* pNewNode = new ListNode<T>(data); pNewNode->_pNext = _pHead->_pNext; _pHead->_pNext->_pPre = pNewNode; pNewNode->_pPre = _pHead; _pHead->_pNext = pNewNode; } void PopFront() { if (Empty()) return; else { ListNode<T>* pDel = _pHead->_pNext; pDel->_pNext->_pPre = _pHead; _pHead->_pNext = pDel->_pNext; delete pDel; } } Iterator Insert(Iterator pos, const T& data) { ListNode<T>* pNewNode = new ListNode<T>(data); pNewNode->_pNext = pos._pCur; pos._pCur->_pPre->_pNext = pNewNode; pNewNode->_pPre = pos._pCur->_pPre; pos._pCur->_pPre = pNewNode; return Iterator(pNewNode); } Iterator Find(const T&data) //指定位置查找 { Iterator it = Begin(); while (it != End()) { if (*it == data) return it; ++it; } return End(); } Iterator Erase(Iterator pos) { ListNode<T>* Ret = pos._pCur->_pNext; pos._pCur->_pPre->_pNext = pos._pCur->_pNext; pos._pCur->_pNext->_pPre = pos._pCur->_pPre; delete pos._pCur; return Iterator(Ret); } bool Empty()const { return _pHead->_pNext == _pHead; } size_t Size()const //计算其大小 {#if 1 size_t count = 0; //方法1 ListNode<T>* pCur = _pHead->_pNext; while (pCur != _pHead) { count++; pCur = pCur->_pNext; } return count;#endif#if 0 size_t count = 0; //方法2 Iterator it = Begin(); while (it != End()) { count++; ++it; } return count;#endif } T& Front() { return _pHead->_pNext->_data; } const T& Front()const { return _pHead->_pNext->_data; } T& Back() { return _pHead->_pPre->_data; } const T& Back()const { return _pHead->_pPre->_data; } void Clear() { Iterator it = Begin(); while (it != End()) { it = Erase(it); } _pHead->_pNext = _pHead; _pHead->_pPre = _pHead; }private: ListNode<T>* _pHead;};#if 1void TestList(){ int array[] = { 1, 2, 3, 4, 5 }; List<int> l(array, sizeof(array) / sizeof(array[0])); l.PushBack(6); l.PushFront(0); List<int>::Iterator it = l.Begin(); while (it != l.End()) { cout << *it << "->"; ++it; } cout << "->NULL" << endl; cout << l.Size() << endl; List<int>::Iterator pos =l. Find( 2); l.Insert(pos, 7); it = l.Begin(); while (it != l.End()) { cout << *it << "->"; ++it; } cout << "->NULL" << endl; l.Erase(pos); it = l.Begin(); while (it != l.End()) { cout << *it << "->"; ++it; } cout << "->NULL" << endl; l.Clear(); cout << l.Size() << endl;}#endifint main(){ TestList(); system("pause"); return 0;}
阅读全文
0 0
- 利用模板类迭代器实现链表
- C++利用链表与模板实现栈
- C++利用链表模板类实现一个简易队列
- 利用模板实现Stack
- 利用模板实现多态
- 利用c++模板实现单链表
- C++利用模板实现队列
- VC利用EXCEL模板实现报表打印
- 利用正则实现简单模板替换功能
- 利用抽象类实现模板设计模式
- 利用c++模板实现求数组最大值
- 利用c++模板实现插入排序
- 利用c++模板实现冒泡排序
- 利用c++模板实现选择排序
- 利用c++模板实现快速排序
- C++利用模板实现一个队列
- 利用模板巧妙实现二级接口
- 利用可变模板参数实现log功能
- PX4源码学习二--PX4环境搭建
- 五周一次课(11月13日) 10.8.1 json(上) 10.8.2 json(下)
- 查看服务器php版本?
- 笔记:udacity计算机导论
- 使用dedecms系统错误调试
- 利用模板类迭代器实现链表
- 60. Permutation Sequence
- dedecms登录后台是白板的问题
- PHP配置,PHP模块安装
- [Python数据分析-01]Pandas数据结构之Series
- spark开发环境搭建(idea和maven)
- Django网站建设-GMOOC-后台管理系统
- h5学习笔记:flex
- 20171114