链表List与链表节点ListNode

#include <iostream>
#define ListNodePosi(T) ListNode<T>*//指针指向列表的结点:里面含有两个指针pred和succ
typedef int Rank;

template <typename T>
class ListNode//列表节点模板类(以双向链表形式实现)
{
public:
	T data;
	ListNode<T>* pred;//节点的前驱指针:指向前结点,而不是前节点的前驱或后驱指针
	ListNode<T>* succ;//节点的后继指针:指向后结点,而不是后节点的前驱或后驱指针
	//构造函数
	ListNode(){}
	ListNode(T e, ListNodePosi(T) p = NULL, ListNodePosi(T) s = NULL) :data(e), pred(p), succ(s)
	{
		//默认构造器
	}
	//操作接口
	ListNode<T>* insertAsPred(T const& e);//结点前插入
	ListNode<T>* insertAsSucc(T const& e);//结点后插入
};
//note:链表节点类主要用于构建列表,所以直接用public

#include "listNode.h"
template <typename T>
class List
{
private://私有的头哨兵和尾哨兵对外部不可见(eg:valid中从外部被等效的视为NULL),首节点尾结点是头哨兵之后的,尾哨兵之前的
	int _size;
	ListNode<T>* header;//头哨兵:header->succ代表头结点
	ListNode<T>* trailer;//尾哨兵
protected:
	void init();
	int clear();
	void copyNodes(ListNodePosi(T) p, int n);
	void merge(ListNodePosi(T)&, int, List<T>&, ListNodePosi(T), int);//有序列表区间合并
	void merge(List<T>& L) { merge(first(), size, L, L.first(), _size); }//全列表合并
	void mergeSort(ListNodePosi(T)& p, int n);//对从p开始的n个节点归并排序
	void selectionSort(ListNodePosi(T) p, int n);//...选择排序
	void insertionSort(ListNodePosi(T) p, int n);//插入排序
public:
	List() { init(); }
	List(List<T> const& L);
	List(List<T> const& L, Rank r, int n);
	List(ListNodePosi(T) p, int n);
	~List();//释放所有节点
..............
}

猜你喜欢

转载自blog.csdn.net/vict_wang/article/details/81590545
今日推荐