列表的元素构成一个线性逻辑次序,元素的物理地址可以任意。
链表(linked list)是一种典型的动态存储结构,其中的数据分散为一系列节点单位。节点之间通过指针相互索引和访问。为了引进新节点或删除原有节点,只需在局部,调整少量相关节点之间的指针。这意味着,采用动态存储策略,可以大大降低动态操作的成本。
列表节点模板类
typedef int Rank; //秩
#define ListNodePosi<T> ListNode<T>* //列表节点位置
template <typename T> struct ListNode { //列表节点模板类:以双向链表形式实现
//成员
T data; ListNodePosi(T) pred; ListNodePosi(T) succ; //数值、前驱、后继
//构造函数
ListNode() {} //针对header和trailer的构造
ListNode( T e, ListNodePosi(T) p = NULL, ListNodePosi s = NULL )
: data(e), pred(p), succ(s) {} //默认构造器
//操作接口
ListNodePosi(T) insertAsPred ( T const& e); //紧靠当前节点之前插入新节点
ListNodePosi(T) insertAsSucc ( T const& e); //紧靠当前节点之后插入新节点
};
列表(List)模板类
#include "listNode.h"
template <typename T> class List { //列表模板类
private:
int _size; ListNodePosi(T) header; ListNodePosi(T) trailer; //规模、头哨兵、尾哨兵
protected:
void init(); //列表创建时的初始化
int clear(); //清除所有节点
void copyNodes ( ListNodePosi(T), int ); //复制列表中自位置p起的n项
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() { List<T> const& L }; //整体复制列表L
List() { List<T> const& L, Rank r, int n }; //复制列表L中自第r项起的n项
List( ListNodePosi(T) p, int n ); //复制列表中自位置p起的n项
//析构函数
~List(); //释放所有节点
//只读访问接口
Rank size() const { return _size; } //规模
bool empty() const { return _size <= 0; } //判空
T& operator[] ( Rank r ) const; //重载,支持循秩访问
ListNodePosi(T) first() const { return header->succ; } //首节点位置
ListNodePosi(T) last() const { return trailer->pred; } //末节点位置
bool valid ( ListNodePosi(T) p ) //判断位置p是否对外合法
{ return p && (trailer != p) && (header != p ); } /