`

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 ;
	}
} ;
 
0
0
分享到:
评论

相关推荐

    实现一个模板类的链表(c++)

    3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_...

    双向链表模板类的实现

    以下是一个简单的双向链表模板类的实现: ```cpp template class DoublyLinkedList { public: DoublyLinkedList() : head(nullptr), tail(nullptr) {} // 插入节点到链表末尾 void append(T value) { Node* ...

    C++中的模板类继承

    在"List-Sorting all in one"这个压缩包文件中,很可能包含了不同排序算法的实现,这些算法都是基于某种模板类的列表结构。列表是常用的数据结构,常用于存储和操作有序的数据集合。通过模板类,我们可以让这个列表...

    基于c++语言模板实现的线性表

    在实现线性表时,我们首先定义一个模板类`List`,其中包含一个指向节点的指针,每个节点存储一个元素和指向下一个节点的指针。模板参数`T`代表我们要存储的数据类型,可以是整型、浮点型、自定义对象等。 ```cpp ...

    C++ 使用模板实现一个List的实例

    在这个实例中,我们将使用模板类来创建一个通用的List,它能够容纳任何类型的数据,如`Stu`结构体。 首先,我们定义一个模板类`List&lt;T&gt;`,其中`T`代表存储的数据类型。这个类包含一个私有内部结构体`Node`,用于...

    用模板实现简单的单向链表的相关操作

    在本话题中,我们将深入探讨如何使用模板来实现一个简单的单向链表,以及这种实现方式带来的好处。 单向链表是一种常见的数据结构,每个节点包含一个数据元素和一个指向下一个节点的指针。链表不同于数组,因为它的...

    STL模板类使用详解.docx

    "STL模板类使用详解" STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由 Alexander Stepanov、Meng Lee 和 David R Musser 在惠普实验室工作时所开发出来的。现在虽说它...

    c++模板类及标准模板

    ### C++模板类及标准模板库详解 C++模板是该语言中一项强大的特性,用于实现参数化多态,允许开发者定义能够处理多种数据类型的通用代码。本文将深入探讨C++模板类及其标准模板库(Standard Template Library, STL...

    STL的list模版实现学生管理系统

    在本项目中,"STL的list模版实现学生管理系统"是使用C++编程语言,特别是标准模板库(STL)中的list容器来构建的一个基本的学生信息管理应用程序。STL的list是一个双向链表,提供了高效的数据插入和删除操作,非常...

    hibernate模板类详解

    ### Hibernate 模板类详解 在Java开发领域中,Hibernate框架是进行对象关系映射(Object-Relational Mapping,简称ORM)的一种常用工具,它能够将面向对象模型的数据与关系型数据库之间的数据进行转换,从而简化了...

    重写C++的list实现增 删 改的功能

    它是一个模板类,可以存储任何类型的对象,只要这些对象能够被复制或移动。`std::list`通常由节点组成,每个节点包含一个元素值和两个指针,分别指向前一个和后一个节点。 **增**: 增加元素到`list`中主要有两种...

    易语言仿java集合 list map源码

    3. 集合类的实现:分析List类和Map类的内部结构,理解它们如何存储和操作数据。 4. 面向接口编程:虽然易语言没有像Java那样的接口概念,但可以通过模拟接口的实现,提供类似的功能。 5. 键值对操作:了解如何在Map...

    C++程序(类模板)

    `Vector`是一个模板类,它提供了类似于STL`vector`的功能,如`push_back()`、`resize()`等。`Vector`类有三个私有成员变量:`alist`存储元素的动态数组,`size`表示当前元素数量,`capacity`表示数组的容量。构造...

    js+css实现网页模板

    本文将深入探讨如何使用 JavaScript 和 CSS 实现一个简易的网页模板。 首先,CSS(Cascading Style Sheets)是用于控制网页布局和样式的语言。通过定义颜色、字体、大小、位置等属性,CSS 可以使网页呈现出独特的...

    ListCtrl控件排序类及演示程序

    3. **排序算法**:排序类可能实现不同的排序算法,如快速排序、归并排序或者更简单的冒泡排序。由于涉及到线程控制,这里可能使用异步排序,确保排序过程不会阻塞用户界面。 4. **线程安全**:考虑到“线程”标签,...

    list用法,很常用的

    在编程领域,`list`是一种非常基础且常用的数据结构,特别是在...Python的`list`提供了丰富的内置方法,而C++的`std::list`作为STL的一部分,利用模板类实现了泛型编程。熟练掌握这些知识对于日常的编程工作至关重要。

    简单链表类

    简单链表类通常是指一个用编程语言实现的链表数据结构,用于存储和操作一系列元素。在这个场景中,"简单链表类"源代码可能是作者为了学习和实践数据结构知识而编写的。 链表不同于数组,它不连续存储数据。每个链表...

    c++ stl list实现简单的学生信息管理系统

    在这个“c++ stl list实现简单的学生信息管理系统”中,我们主要关注的是使用STL中的`list`容器来管理学生信息。`list`是一种双向链表,允许快速地在中间插入和删除元素,这使得它成为实现动态数据结构的理想选择。 ...

    标准库list源码

    - `list`的实现通常基于模板类,这意味着它可以存储任何类型的数据,只要该类型支持赋值操作。 - `list`的主要操作包括插入、删除、迭代器操作、大小调整等。这些操作在源码中会对应不同的成员函数,例如`push_back`...

    大整数的运算

    3. **自定义链表实现**:这里特别提到不使用STL的`list`,这表明实现者选择手动创建一个链表类以控制每个细节。这样做的好处是可以针对大整数运算的特性进行优化,比如快速比较、插入和删除等操作。同时,自定义链表...

Global site tag (gtag.js) - Google Analytics