Files
912-notes/thu_dsa/chp9/quadlist.h
2019-11-08 16:14:27 +08:00

100 lines
2.4 KiB
C++

#ifndef QUADLIST_H_
#define QUADLIST_H_
#define QuadNodePosi(T) QuadNode<T>*
#define MAXINT (int)(0x7fffffff)
#define MININT (int)(0x80000000)
template <typename T>
class QuadNode{
public:
T entry;
QuadNodePosi(T) prev;
QuadNodePosi(T) next;
QuadNodePosi(T) above;
QuadNodePosi(T) below;
QuadNode() = default;
QuadNode(T entry) :entry(entry) {}
};
template <typename T>
class QuadList{
private:
QuadNodePosi(T) __head;
QuadNodePosi(T) __tail;
int __size;
public:
//constructor
QuadList();
//external interfaces
//read-only interfaces
int size() const { return __size; }
bool empty() const { return size() == 0; }
QuadNodePosi(T) first() const { return __head->next;}
QuadNodePosi(T) last() const { return __tail->prev;}
QuadNodePosi(T) prev(QuadNodePosi(T) p) const { return p->prev; }
QuadNodePosi(T) next(QuadNodePosi(T) p) const { return p->next; }
//writable interfaces
void sethead(T entry) { __head->entry = entry; }
void settail(T entry) { __tail->entry = entry; }
void connectTo(QuadList<T>* down);
void insert_before_above(QuadNodePosi(T) p, T const& entry, QuadNodePosi(T) base = nullptr);
void insert_after_above(QuadNodePosi(T)p, T const & entry, QuadNodePosi(T) base = nullptr);
void remove(QuadNodePosi(T) p);
};
//constructor
template <typename T>
QuadList<T>::QuadList(){
__head = new QuadNode<T>();
__tail = new QuadNode<T>();
__size = 0;
__head->next = __tail;
__head->prev = __tail;
__tail->next = __head;
__tail->prev = __head;
}
//writable interfaces
template <typename T>
void QuadList<T>::connectTo(QuadList<T>* down){
//assert(down != nullptr);
__head->below = down->__head;
__tail->below = down->__tail;
down->__head->above = __head;
down->__tail->above = __tail;
}
template <typename T>
void QuadList<T>::insert_before_above(QuadNodePosi(T) p, T const & entry, QuadNodePosi(T) base){
QuadNodePosi(T) newNode = new QuadNode<T>(entry);
newNode->next = p;
newNode->prev = p->prev;
p->prev = newNode;
newNode->prev->next = newNode;
if(base) base->above = newNode;
newNode->below = base;
++__size;
}
template <typename T>
void QuadList<T>::insert_after_above(QuadNodePosi(T) p, T const & entry, QuadNodePosi(T) base) {
insert_before_above(p->next, entry, base);
}
template <typename T>
void QuadList<T>::remove(QuadNodePosi(T) p){
//assert(p != head && p != tail);
p->prev->next = p->next;
p->next->prev = p->prev;
--__size;
}
#endif