#pragma once
#include <iostream>
#include <string>
using namespace std;
template<typename T> class DblList;
template<typename T> class DblNode {
T info;
DblNode<T> *llink, *rlink;
public:
DblNode(T data);
DblNode();
T Getinfo() { return info; }
friend class DblList<T>;
};
template<typename T> DblNode<T>::DblNode() {
llink = rlink = NULL;
}
template<typename T> DblNode<T>::DblNode(T data) {
info = data;
llink = rlink = NULL;
}
template<typename T> class DblList {
DblNode<T> *head, *current;
public:
DblList();
~DblList();
void Insert(const T &data);
DblNode<T> *Remove(DblNode<T> *p);
void Print();
int Length();
DblNode<T> *Find(T data);
void MakeEmpty();
};
template<typename T> DblList<T>::DblList() {
head = new DblNode<T>();
head->rlink = head->llink = head;
current = NULL;
}
template<typename T> DblList<T>::~DblList() {
MakeEmpty();
delete head;
}
template<typename T> void DblList<T>::MakeEmpty() {
DblNode<T> *tempP;
while (head->rlink != head) {
tempP = head->rlink;
head->rlink = tempP->rlink;
tempP->rlink->llink = head;
delete tempP;
}
current = NULL;
}
template<typename T> void DblList<T>::Insert(const T &data) {
current = new DblNode<T>(data);
current->rlink = head;
current->llink = head->llink;
head->llink->rlink = current;
head->llink = current;
}
template<typename T> DblNode<T> *DblList<T>::Remove(DblNode<T> *p) {
current = head->rlink;
while (current != head && current != p)
current = current->rlink;
if (current == head)
current = NULL;
else {
p->rlink->llink = p->llink;
p->llink->rlink = p->rlink;
p->llink = p->rlink = NULL;
}
return current;
}
template<typename T> DblNode<T> *DblList<T>::Find(T data) {
current = head->rlink;
while (current != head && current->info != data)
current = current->rlink;
if (current == head)
current = NULL;
return current;
}
template<typename T> void DblList<T>::Print() {
current = head->rlink;
while (current != head) {
cout << current->info << '\t';
current = current->rlink;
}
cout << endl;
}
template<typename T> int DblList<T>::Length() {
int count = 0;
current = head->rlink;
while (current != head) {
count++;
current = current->rlink;
}
return count;
}