最近学数据结构,于是尝试着去实现了一个 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 ;
}
} ;
分享到:
相关推荐
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* ...
在"List-Sorting all in one"这个压缩包文件中,很可能包含了不同排序算法的实现,这些算法都是基于某种模板类的列表结构。列表是常用的数据结构,常用于存储和操作有序的数据集合。通过模板类,我们可以让这个列表...
在实现线性表时,我们首先定义一个模板类`List`,其中包含一个指向节点的指针,每个节点存储一个元素和指向下一个节点的指针。模板参数`T`代表我们要存储的数据类型,可以是整型、浮点型、自定义对象等。 ```cpp ...
在这个实例中,我们将使用模板类来创建一个通用的List,它能够容纳任何类型的数据,如`Stu`结构体。 首先,我们定义一个模板类`List<T>`,其中`T`代表存储的数据类型。这个类包含一个私有内部结构体`Node`,用于...
在本话题中,我们将深入探讨如何使用模板来实现一个简单的单向链表,以及这种实现方式带来的好处。 单向链表是一种常见的数据结构,每个节点包含一个数据元素和一个指向下一个节点的指针。链表不同于数组,因为它的...
"STL模板类使用详解" STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由 Alexander Stepanov、Meng Lee 和 David R Musser 在惠普实验室工作时所开发出来的。现在虽说它...
### C++模板类及标准模板库详解 C++模板是该语言中一项强大的特性,用于实现参数化多态,允许开发者定义能够处理多种数据类型的通用代码。本文将深入探讨C++模板类及其标准模板库(Standard Template Library, STL...
在本项目中,"STL的list模版实现学生管理系统"是使用C++编程语言,特别是标准模板库(STL)中的list容器来构建的一个基本的学生信息管理应用程序。STL的list是一个双向链表,提供了高效的数据插入和删除操作,非常...
### Hibernate 模板类详解 在Java开发领域中,Hibernate框架是进行对象关系映射(Object-Relational Mapping,简称ORM)的一种常用工具,它能够将面向对象模型的数据与关系型数据库之间的数据进行转换,从而简化了...
它是一个模板类,可以存储任何类型的对象,只要这些对象能够被复制或移动。`std::list`通常由节点组成,每个节点包含一个元素值和两个指针,分别指向前一个和后一个节点。 **增**: 增加元素到`list`中主要有两种...
3. 集合类的实现:分析List类和Map类的内部结构,理解它们如何存储和操作数据。 4. 面向接口编程:虽然易语言没有像Java那样的接口概念,但可以通过模拟接口的实现,提供类似的功能。 5. 键值对操作:了解如何在Map...
`Vector`是一个模板类,它提供了类似于STL`vector`的功能,如`push_back()`、`resize()`等。`Vector`类有三个私有成员变量:`alist`存储元素的动态数组,`size`表示当前元素数量,`capacity`表示数组的容量。构造...
本文将深入探讨如何使用 JavaScript 和 CSS 实现一个简易的网页模板。 首先,CSS(Cascading Style Sheets)是用于控制网页布局和样式的语言。通过定义颜色、字体、大小、位置等属性,CSS 可以使网页呈现出独特的...
3. **排序算法**:排序类可能实现不同的排序算法,如快速排序、归并排序或者更简单的冒泡排序。由于涉及到线程控制,这里可能使用异步排序,确保排序过程不会阻塞用户界面。 4. **线程安全**:考虑到“线程”标签,...
在编程领域,`list`是一种非常基础且常用的数据结构,特别是在...Python的`list`提供了丰富的内置方法,而C++的`std::list`作为STL的一部分,利用模板类实现了泛型编程。熟练掌握这些知识对于日常的编程工作至关重要。
简单链表类通常是指一个用编程语言实现的链表数据结构,用于存储和操作一系列元素。在这个场景中,"简单链表类"源代码可能是作者为了学习和实践数据结构知识而编写的。 链表不同于数组,它不连续存储数据。每个链表...
在这个“c++ stl list实现简单的学生信息管理系统”中,我们主要关注的是使用STL中的`list`容器来管理学生信息。`list`是一种双向链表,允许快速地在中间插入和删除元素,这使得它成为实现动态数据结构的理想选择。 ...
- `list`的实现通常基于模板类,这意味着它可以存储任何类型的数据,只要该类型支持赋值操作。 - `list`的主要操作包括插入、删除、迭代器操作、大小调整等。这些操作在源码中会对应不同的成员函数,例如`push_back`...
3. **自定义链表实现**:这里特别提到不使用STL的`list`,这表明实现者选择手动创建一个链表类以控制每个细节。这样做的好处是可以针对大整数运算的特性进行优化,比如快速比较、插入和删除等操作。同时,自定义链表...