列表实现
列表节点类
#ifndef LISTNODE
#define LISTNODE
#define ListNodePosi(T) ListNode<T>*
#define NULL 0
template <typename T>
struct ListNode {
T data; //数据域
ListNodePosi(T) pred; //直接前驱指针
ListNodePosi(T) succ; //直接后继指针
ListNode() {
} //默认构造函数 针对header和trailer节点的构造 默认为NULL
ListNode(T e, ListNodePosi(T) p = NULL, ListNodePosi(T) s = NULL):data(e), pred(s), succ(s) {
}
ListNodePosi(T) insertAsPred(const T &e); //在当前节点前插入新节点
ListNodePosi(T) insertAsSucc(const T &e); //在当前节点后插入新节点
};
/*在当前节点前插入新节点*/
template <typename T>
ListNodePosi(T) ListNode<T>::insertAsPred(const T &e) {
ListNodePosi(T) temp = new ListNode(e, this->pred, this); //1.先创建当前节点的新前驱节点
pred->succ = temp; //2.当前节点的老前驱节点的后继节点更换为新节点
pred = temp; //3.当前节点的前驱节点更换为新节点
return temp; //2和3的顺序一定不能颠倒!!!
}
/*在当前节点后插入新节点*/
template <typename T>
ListNodePosi(T) ListNode<T>::insertAsSucc(const T &e) {
ListNode<T> temp = new ListNode(e, this, this->succ); //1.先创建当前节点的新后继节点
succ->pred = temp; //2.当前节点的老后继节点的前驱节点更换为新节点
succ = temp; //3.当前节点的后继节点更换为新节点
return temp; //2和3的顺序一定不能颠倒!!!
}
/*
不能颠倒的原因,第2步的当前节点仍然存储着曾经的老前驱,老后继节点的位置,
如果先更新当前节点的新前驱,新后继节点,将导致老前驱,老后继节点的丢失
*/
#endif
列表类
#ifndef LIST
#define LIST
#define NULL 0
#include "ListNode.h"
template <typename T>
class List {
private:
/*定义节点数 头指针 尾指针*/
int size; ListNodePosi(T) header; ListNodePosi(T) trailer;
protected:
/*创建 清除列表*/
void init(); //创建列表
int clear(); //清除列表
/*复制构造 归并排序内部调用函数*/
void