List::定义

38 篇文章 1 订阅
22 篇文章 0 订阅

结点的定义:

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(T) s = NULL)
      : data(e), pred(p), succ(s) {} //默认构造器
// 操作接口
   ListNodePosi(T) insertAsPred(T const & e); //紧靠当前节点之前插入新节点
   ListNodePosi(T) insertAsSucc(T const & e); //紧随当前节点之后插入新节点
};

链表的定义(这儿用的是双向链表):

#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); } //将头、尾节点等同于NULL
   int disordered() const; //判断列表是否已排序
   ListNodePosi(T) find(T const & e) const  //无序列表查找
      { return find(e, _size, trailer); }
   ListNodePosi(T) find(T const & e, int n, ListNodePosi(T) p) const; //无序区间查找
   ListNodePosi(T) search(T const & e) const  //有序列表查找
      { return search(e, _size, trailer); }
   ListNodePosi(T) search(T const & e, int n, ListNodePosi(T) p) const; //有序区间查找
   ListNodePosi(T) selectMax(ListNodePosi(T) p, int n); //在p及其前n-1个后继中选出最大者
   ListNodePosi(T) selectMax() { return selectMax(header->succ, _size); } //整体最大者
// 可写访问接口
   ListNodePosi(T) insertAsFirst(T const & e); //将e当作首节点插入
   ListNodePosi(T) insertAsLast(T const & e); //将e当作末节点插入
   ListNodePosi(T) insertBefore(ListNodePosi(T) p, T const & e); //将e当作p的前驱插入
   ListNodePosi(T) insertAfter(ListNodePosi(T) p, T const & e); //将e当作p的后继插入
   T remove(ListNodePosi(T) p); //删除合法位置p处的节点,返回被删除节点
   void merge(List<T>& L) { merge(first(), size, L, L.first(), L._size); } //全列表归并
   void sort(ListNodePosi(T) p, int n); //列表区间排序
   void sort() { sort(first(), _size); } //列表整体排序
   int deduplicate(); //无序去重
   int uniquify(); //有序去重
   void reverse(); //前后倒置(习题)
// 遍历
   void traverse(void (*)(T&)); //遍历,依次实施visit操作(函数指针,只读或局部性修改)
   template <typename VST> //操作器
   void traverse(VST&); //遍历,依次实施visit操作(函数对象,可全局性修改)
}; //List

#include "List_implementation.h"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值