1 列表实现
1.1 ListNode节点结构体
构建列表的前提是建造一个列表节点的结构体,这个结构体表示了列表的最小单元。ListNode结构体一般包括的成员有数据,前驱与后继。
typedef int Rank; // 秩
#define ListNodePosi(T) ListNode<T>* //列表节点位置
template <typename T> struct ListNode{
//成员
T data; ListNodePosi(T) pred; ListNodePosi(T) succ;
//构造函数
ListNode() {
};
ListNode( T e, ListNodePosi(T) p = NULL, ListNodePosi(T) s =NULL)
:data( e ), pred( p ), succ ( s ){
}
//操作接口
ListNodePosi(T) insertAsPred ( T const& e);
ListNodePosi(T) insertAsSucc ( T const& e);
};
1.2 List类
List类是列表的主体部分,是列表得以在ListNode结构体基础上完成各项操作的地基。
#include "listnode.h"
template <typename T> class List{
private:
int _size; ListNodePosi(T) header; ListNodePosi(T) trailer;
protected:
void init();
int clear();
void merge( ListNodePosi(T)&, int, List<T>&, ListNodePosi(T), int );
void mergeSort (ListNodePosi(T)&, int);//从对p开始的连续n个节点归并排序
void selectionSort ( ListNodePosi(T), int);//从对p开始的连续n个节点选择排序
void insertionSort ( ListNodePosi(T) , int );//从对p开始的连续n个节点插入排序
public:
//构造与析构
List() {
init();}
~List();
bool empty() const{
return _size <= 0;}
ListNodePosi(T) last() const {
return trailer->pred;}
ListNodePosi(T) first() const {
return header->succ;}
T& operator[] (Rank r) const;//重载,支持循秩访问(效率低)
//排序相关
ListNodePosi(T) search( T const& e, int n, ListNodePosi(T) p) const;
ListNodePosi(T) selectMax( ListNodePosi(T) p, int n);
void sort( ListNodePosi(T) p, int n);
//插入与删除
ListNodePosi(T) insertAsFirst(T const& e);
ListNodePosi(T) insertAsLast(T const& e);
ListNodePosi(T) insertA(ListNodePosi(T) p, T const& e);//将e当做p的后继插入
ListNodePosi(T) insertB(ListNodePosi(T) p, T const& e);//将e当做p的前驱插入
T remove(ListNodePosi(T) p);//删除合法位置p处的节点,返回被删除节点
//遍历
void traverse (void (*)(T&) );
template <typename VST> //操作器
void traverse(VST&);
};//List
//默认构造方法
template <typename T> void List<T>::init(){
header = new ListNode<T>;
trailer = new ListNode<T>;
header->succ = trailer;
header->pred = nullptr;
trailer->pred = header;
trailer->succ