我在用模板实现List的时候有很多奇奇怪怪的错误,以下我分享出来共勉,希望大家不要掉到和我一样的洞里。
1)因为使用的是模板,所以在每个需要换类型的地方都换成模板参数T(我用的是T,读者可自己定义)
2)赋值运算符的返回值和参数要带上<T>
3)“*”:我在定义的节点类中,它不是内置类型,所以在下面使用的时候变量不要加*,如果加的话,就要进行重载
//双向链表
#include<iostream>
#include<assert.h>
using namespace std;
//typedef Node<T> Node;
template<typename T>
struct Node
{
Node(const T& data)
: _data(data)
, _pNext(NULL)
, _pPre(NULL)
{}
T _data; //链表中的数据
Node<T>* _pNext; //下一个节点
Node<T>* _pPre; //前一个节点
};
template<typename T>
class List
{
public:
friend ostream& operator<<(ostream& _cout, const List<T>& l); //重载输出流
List(); //无参构造函数
List(const T arr[], size_t size); //有参构造函数
List(const List<T>& l); //拷贝构造函数
List<T>& operator=(const List<T>& l); //赋值重载函数
~List; //析构函数
public:
bool Empty()const; //判断链表是否为空
void PushBack(const T& data); //尾插
void PopBack(); //尾删
void PushFront(const T& data); //头插
void PopFront(); //头删
Node<T>* Find(const T& data); //查找特定元素
void Insert(Node<T>* pos, const T& data); //在特定的位置插入一个元素
void Erase(Node<T>* pos); //删除特定位置的元素
Node<T>& Front(); //返回链表中第一个元素
const Node<T>& Front()const;
Node<T>& Back(); //返回链表中最后一个元素