一些说明:我在这里实现的链表是双向链表,需要的说明几乎都在代码里进行说明了,所以其他的我也就不废话了,直接将代码贴出来,以供大家学习参考,当然有错误的欢迎指正。
//双向链表
#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(); //返回链表中最后一个元素
const Node<T>& Back()const;
void Clear(); //清空链表
size_t Size()const; //求链表的有效元素个数
void Print(); //顺序打印
void Print_L(); //逆序打印
private:
Node<T>* BuyNewNode(const T& data);
private:
Node<T>* _pHead;
Node<T>* _pTail;
size_t