#include<iostream>
using namespace std;
template<class T>
struct Node{
T data;
Node<T>* next;
Node<T>* pre;
int freq;
Node(Node<T>* p = NULL , Node<T>* n = NULL)
{
freq = 0;
next = n;
pre = p;
}
Node(const T& item , Node<T>* p = NULL , Node<T>* n = NULL)
{
freq = 0;
data = item;
next = n;
pre = p;
}
};
template<class T>
class DoubleLinkList{//双链表
public:
DoubleLinkList(){
head = current = new Node<T>();
count = 0;
}
~DoubleLinkList(){
Node<T>* temp;
while(head->next != NULL){
temp = head->next;
head->next = temp->next;
delete temp;
count--;
}
}
int length() const
{
return count;
}
Node<T>*& getHead()
{
return head;
}
bool insert(int index , T x){
if(index > count || index < -1){
cerr << "索引越界!" << endl;
return false;
}
Node<T>* temp = head;
if(index != 0){
temp = head->next;
for(int i = 0; i < index-1; i++){
temp = temp->next;
}
}
temp->next = new Node<T>(x,temp,temp->next);
count++;
return true;
}
bool add(T x){
return insert(count,x);
}
void print(){
Node<T>* temp = head->next;
while(temp != NULL){
cout << temp->data << " ";
temp = temp->next;
}
}
private:
Node<T>* head;
Node<T>* current;
int count;
public:
Node<T>* Locate(T x)
{//2.3.7.20
Node<T>* obj = head->next;
while(obj != NULL && obj->data != x)
obj = obj->next;
obj->freq++;
Node<T>* temp = obj->pre;
while(temp != head && temp->freq <= obj->freq)
temp = temp->pre;
obj->pre->next = obj->next;
obj->next->pre = obj->pre;
obj->next = temp->next;
obj->next->pre = obj;
temp->next = obj;
obj->pre = temp;
return obj;
}
/*
***************************END***************************
*/
/*
**********************作者QQ632660120 *******************
*/
};