list 模板类的简单实现

本文介绍了一个简单的List类实现过程,包括Node节点类、迭代器类及List类的基本功能。该实现未包含错误和边界检测,适合初学者理解双向链表的工作原理。

最近学数据结构,于是尝试着去实现了一个 list 类,发现确实有很多问题,特别是类的继承这一块,有些问题搞不懂……

这个 list 类只是一个简单的实现,只提供了基本的功能,也没有边界检测什么的,越界访问的问题由使用者自己把握……

很多功能都是没有实现的,总得来说这是一个比较裸的 list 模板类,没有什么实用价值……


/* THE PROGRAM IS MADE BY PYY */ //#include <iostream> //#include "class.h" //using namespace std ; ////////////////////////////////////////////////////////////////////////// // // Decleration // template <class T> class Node ; template <class T> class List ; template <class T> class const_Iterator ; template <class T> class Iterator ; ////////////////////////////////////////////////////////////////////////// // // Node // template <class T> class Node { friend class List<T> ; friend class const_Iterator<T> ; friend class Iterator<T> ; private: T elem ; Node *prev ; Node *next ; Node (const T &t = *(new T), Node *p = 0, Node *n = 0) : elem(t), prev(p), next(n) {} } ; ////////////////////////////////////////////////////////////////////////// // // const_Iterator // template <class T> class const_Iterator { friend class List<T> ; protected: typedef const_Iterator<T> ci_t ; public: const_Iterator (Node<T> * n) : pNode(n) {} const_Iterator (const ci_t &ci) : pNode(ci.pNode) {} const T & operator* () const { return pNode->elem ; } const T * operator->() const { return &pNode->elem ; } ci_t operator= (const ci_t &ci) { pNode = ci.pNode ; return *this ; } // ++ ci_t & operator++() { pNode = pNode->next ; return *this ; } ci_t operator++ (int) { ci_t ci(*this) ; pNode = pNode->next ; return ci ; } // -- ci_t & operator--() { pNode = pNode->prev ; return *this ; } ci_t operator--(int) { ci_t ci(*this) ; pNode = pNode->prev ; return ci ; } // == bool operator== (const ci_t &ci) const { return pNode == ci.pNode ; } bool operator!= (const ci_t &ci) const { return !(*this == ci) ; } protected: Node<T> *pNode ; } ; ////////////////////////////////////////////////////////////////////////// // // Iterator // template <class T> class Iterator: public const_Iterator<T> { friend class List<T> ; using const_Iterator<T>::pNode ; // 不加这句,codeblocks 就一直提示错误: // error: 'pNode' was not declared in this scope| public: Iterator (Node<T> * n) : const_Iterator<T>(n) {} Iterator (const Iterator &ci): const_Iterator<T>(ci) {} Iterator operator= (const Iterator &ci) { pNode = ci.pNode; return *this ;} T & operator* () { return const_Iterator<T>::pNode->elem ; } T * operator->() { return &const_Iterator<T>::pNode->elem ; } // 不重定义这些操作符,所有对 Iterator 的操作(++,--)的结果都会返回 基类, // 导致无法实现这些 修改内容 的语句:erase (--end()) ; // 编译器会提示,const_Iterator<T> 类无法转换为 Iterator<T> 类 Iterator & operator-- () { pNode = pNode->prev ; return *this ; } Iterator operator-- (int) { Iterator itr(*this) ; pNode = pNode->prev ; return itr ; } Iterator & operator++ () { pNode = pNode->next ; return *this ; } Iterator operator++ (int) { Iterator itr(*this) ; pNode = pNode->next ; return itr ; } } ; ////////////////////////////////////////////////////////////////////////// // // List, 简单实现,无错误检测,无边界检测 // template <class T> class List { public: typedef const_Iterator<T> const_iterator ; typedef Iterator<T> iterator ; public: // Copy controy List () { init () ; } ~List () { clear () ; delete head ; delete tail ; } const List<T> & operator= (const List<T> &rhs) { if (this == &rhs) return *this ; clear () ; for (const_iterator itr = rhs.begin () ; itr != rhs.end() ; ++itr) push_back (*itr) ; return *this ; } // Iterators iterator begin () { return iterator(head->next) ; } const_iterator begin () const { return const_iterator(head->next) ; } iterator end () { return iterator(tail) ; } const_iterator end () const { return const_iterator(tail) ; } // rbegin () ; // rend () ; // Capacity bool empty () const { return !theSize ; } int size () const { return theSize ; } // max_size () ; // resize () ; // Element access T front () { return *begin () ; } const T front () const { return *begin () ; } T back () { return *--end () ; } const T back () const { return *--end () ; } // Modifiers // assign () ; void push_front (const T &t) { insert (begin(), t) ; } void pop_front () { erase (begin()) ; } void push_back (const T &t) { insert (end(), t) ; } void pop_back () { erase (--end()) ; } // 只能修改 iterator 类指定的内容,如果 const_iterator 类传进来,就会提示 // 基类 无法转换为 继承类。从而导致编译不通过 iterator insert (iterator itr, const T &t) { ++theSize ; Node<T> *pCurNode = itr.pNode ; return iterator( pCurNode->prev = pCurNode->prev->next = new Node<T>(t, pCurNode->prev, pCurNode)) ; } iterator erase (iterator itr) { Node<T> *curNode = itr.pNode ; Node<T> *nextNode = curNode->next ; curNode->prev->next = curNode->next ; curNode->next->prev = curNode->prev ; delete curNode ; --theSize ; return iterator(nextNode) ; } iterator erase (iterator start, iterator end) { while (!empty() && (start != end)) start = erase (start) ; return end ; } // swap void clear () { erase (begin(), end()) ; } /* // Operations splice remove remove_if unique merge sort reverse // Allocator get_allocator */ private: Node<T> *head ; Node<T> *tail ; int theSize ; void init () { head = new Node<T> ; tail = new Node<T> ; head->next = tail ; tail->prev = head ; theSize = 0 ; } } ;

面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值