/*************************************************************************
Copyright : Free
Author : Cheng Haifeng
Date : 2017-10-17
Description : LinkedList
Environment : RAD Studio XE7
************************************************************************ */
/*************************************************************************
T 的需求
T 如果为内置类型,无特殊需求。
T 如果为类或结构体,请重载operator ==和>。
必要时需重载 operator=,无参构造函数和赋值构造函数。
************************************************************************ */
// 节点
template
class LinkedNode {
public:
typedef LinkedNode
_Node;
typedef _Node *_Nodeptr;
T Value; // 数据;如果是头节点则不使用。
_Nodeptr Next; // 后续节点指针;如果是头节点,则为第一节点指针。
_Nodeptr Prev; // 前任节点指针;如果是头节点,则为最后节点指针。
}; // LinkedNode 节点结束
template
class LinkedList : public LinkedNode
{
protected:
typedef LinkedNode
::_Node _Node; typedef LinkedNode
::_Node *_Nodeptr; typedef LinkedNode
::_Nodeptr& _Nodepref; typedef LinkedList
*_Listptr; // 申请的节点内存 static _Nodeptr _NewNode(_Nodeptr prev = NULL, _Nodeptr next = NULL) { _Nodeptr node = new _Node; _NextNode(node) = next; _PrevNode(node) = prev; return node; } // 释放节点内存 static void _DelNode(_Nodeptr ptr) { delete ptr; } // 返回节点后续指针的引用 static _Nodepref _NextNode(_Nodeptr ptr) { return ((_Nodepref)(*ptr).Next); } // 返回节点前驱指针的引用 static _Nodepref _PrevNode(_Nodeptr ptr) { return ((_Nodepref)(*ptr).Prev); } // 返回节点数据的引用 static T& _ValueNode(_Nodeptr ptr) { return (*ptr).Value; } // 数据节点数量 int _Count; public: // 迭代器内部类 class Iterator { friend class LinkedList
; public: // 构造函数 p - 父节点或父类指针 Iterator(_Listptr p) : Headptr(p), Nodeptr(p) { } // 析构函数 ~Iterator() { } // 移动到第一个元素,返回是否成功。 bool MoveFirst() { Nodeptr = _NextNode(Headptr); return Headptr != Nodeptr; } // 移动到下一节点,返回是否成功。 bool MoveNext() { Nodeptr = _NextNode(Nodeptr); return Headptr != Nodeptr; } T& Value() { return _ValueNode(Nodeptr); } // 删除当前节点,移动前一节点 void Remove() { _Nodeptr Pnode = Nodeptr; if (Pnode != Headptr) { // 头节点就不要删了 Nodeptr = _PrevNode(Nodeptr); _NextNode(_PrevNode(Pnode)) = _NextNode(Pnode); _PrevNode(_NextNode(Pnode)) = _PrevNode(Pnode); _DelNode(Pnode); Headptr->_Count--; } } protected: // 节点指针 _Nodeptr Nodeptr; // 头/尾节点指针,也是父类指针 _Listptr Headptr; }; // 迭代器内部类结束 // 删除节点,并释放节点空间,删除后Iterator失效。 void Remove(T value) { _Nodeptr Pnext; _Nodeptr Pnode = _NextNode(this); while (Pnode != this) { Pnext = _NextNode(Pnode); if (value == _ValueNode(Pnode)) { _NextNode(_PrevNode(Pnode)) = _NextNode(Pnode); _PrevNode(_NextNode(Pnode)) = _PrevNode(Pnode); _DelNode(Pnode); _Count--; } Pnode = Pnext; } } // 删除第一个节点 void RemoveFront() { _Nodeptr Pnode = _NextNode(this); if (Pnode != this) { _NextNode(_PrevNode(Pnode)) = _NextNode(Pnode); _PrevNode(_NextNode(Pnode)) = _PrevNode(Pnode); _DelNode(Pnode); _Count--; } } // 删除最后一个节点 void RemoveBack() { _Nodeptr Pnode = _PrevNode(this); if (Pnode != this) { _NextNode(_PrevNode(Pnode)) = _NextNode(Pnode); _PrevNode(_NextNode(Pnode)) = _PrevNode(Pnode); _DelNode(Pnode); _Count--; } } // 无参构造函数 LinkedList() : LinkedNode
() { _NextNode(this) = this; _PrevNode(this) = this; _Count = 0; } // 析构函数 ~LinkedList() { Clear(); } // 清空链表 void Clear() { _Nodeptr Pnext; _Nodeptr Pnode = _NextNode(this); while (Pnode != this) { Pnext = _NextNode(Pnode); _DelNode(Pnode); Pnode = Pnext; } _NextNode(this) = this; _PrevNode(this) = this; _Count = 0; } // 检查是否为空 bool Empty() { return _Count == 0; } // 链表大小 - 节点数量 int Count() { return _Count; } // 反转列表 void Reverse() { _Nodeptr Pnode = this; _Nodeptr Pnext; do { Pnext = _NextNode(Pnode); _NextNode(Pnode) = _PrevNode(Pnode); _PrevNode(Pnode) = Pnext; Pnode = Pnext; } while (Pnode != this); } // 冒泡排序 - 当asc=true时,升序排列;false 降序。需重载T的>操作符。 void Sort(bool asc = true) { _Nodeptr tail = this; while (_NextNode(this) != tail) { _Nodeptr n1 = _NextNode(this); // 第一个节点 _Nodeptr n2 = _NextNode(n1); // 第二个节点 while (n2 != tail) { if ((_ValueNode(n1) > _ValueNode(n2)) == asc) { _NextNode(_PrevNode(n1)) = n2; _NextNode(n1) = _NextNode(n2); _NextNode(n2) = n1; _PrevNode(_NextNode(n1)) = n1; _PrevNode(n2) = _PrevNode(n1); _PrevNode(n1) = n2; n2 = _NextNode(n1); } else { n1 = _NextNode(n1); n2 = _NextNode(n2); } } tail = n1; } } // 删除重复节点 void Unique() { _Nodeptr node = _NextNode(this); while (node != this) { _Nodeptr next = _NextNode(node); while (next != this) { if (_ValueNode(node) == _ValueNode(next)) { _Nodeptr pnode = _NextNode(next); _NextNode(_PrevNode(next)) = _NextNode(next); _PrevNode(_NextNode(next)) = _PrevNode(next); _DelNode(next); _Count--; next = pnode; } else { next = _NextNode(next); } } node = _NextNode(node); } } // 在节点前插入数据 void InsertFront(Iterator iter, const T data) { _Nodeptr Pnode = iter.Nodeptr; _Nodeptr Newnode = _NewNode(_PrevNode(Pnode), Pnode); _NextNode(_PrevNode(Pnode)) = Newnode; _PrevNode(Pnode) = Newnode; _ValueNode(Newnode) = data; _Count++; } // 在第一个节点前插入数据 void InsertFront(const T data) { InsertBack(GetIterator(), data); } // 在节点后插入数据 void InsertBack(Iterator iter, const T data) { _Nodeptr Pnode = iter.Nodeptr; _Nodeptr Newnode = _NewNode(Pnode, _NextNode(Pnode)); _PrevNode(_NextNode(Pnode)) = Newnode; _NextNode(Pnode) = Newnode; _ValueNode(Newnode) = data; _Count++; } // 在最后一个节点后插入数据 void InsertBack(const T data) { InsertFront(GetIterator(), data); } // 获得头节点 Iterator GetIterator() { return Iterator(this); } };
LinkedList泛型链表类
最新推荐文章于 2024-07-11 00:34:27 发布