#include"AllHead.h"
template<class T>
class DbList;
template<class T>
class DbListNode
{
template<class T>
friend class DbList;
private:
DbListNode<T> *pre;
DbListNode<T> *next;
T data;
public:
DbListNode(DbListNode<T> *pt = NULL,DbListNode<T> *nt = NULL)
{
pre = pt;
next = nt;
}
DbListNode(T x,DbListNode<T> *pt = NULL,DbListNode<T> *nt = NULL)
{
data = x;
pre = pt;
next = nt;
}
};
template<class T>
class DbList
{
private:
DbListNode<T> *begin;
DbListNode<T> *end;
size_t size;
public:
DbList()
{
begin = new DbListNode<T>;
end = begin;
begin->pre = end;
end->next = begin;
size = 0;
}
~DbList(){makeEmpty();}
Status push_back(T x);
Status push_front(T x);
T getHead();
T getLast();
void show_dblist();
size_t getLenth(){return size;}
void makeEmpty();
Status IsEmpty(){return begin == end?TRUE:FALSE;}
Status pop_back();
Status pop_front();
Status insert_val(T x);
Status del_val(T x);
void sort();
void reverse();
};
template<class T>
void DbList<T>::reverse()
{
DbListNode<T> *p = begin->next->next;
DbListNode<T> *h;
begin->next->next = begin;
begin->pre = begin->next;
end = begin->next;
h = p->next;
while(p!=begin)
{
p->next = begin->next;
p->pre = begin;
begin->next->pre = p;
begin->next = p;
p = h;
h = h->next;
}
}
template<class T>
void DbList<T>::sort()
{
if(IsEmpty())
{
cout<<"链表为空(sort)..."<<endl;
}
else
{
//p和m是断开后面的两个指针
DbListNode<T> *p = begin->next;//p在后
DbListNode<T> *m; //m在前
p->pre->next = begin;
begin->pre = p->pre;
end = begin;
//h是新的链表这边的指针
DbListNode<T> *h;
while(p!=begin)
{
m = p;
p = p->next;
h = begin->next;
while(h!=begin && m->data>h->data)
{
h = h->next;
}
if(h == begin)
{
end = m;
}
m->next = h;
m->pre = h->pre;
h->pre->next = m;
h->pre = m;
}
}
}
template<class T>
Status DbList<T>::del_val(T x)
{
DbListNode<T> *p = begin->next;
while(p!=begin&&p->data!=x)
{
p = p->next;
}
if(p == begin)
{
cout<<"该值不存在..."<<endl;
return ERROR;
}
if(p == end)
{
end = p->pre;
}
p->pre->next = p->next;
p->next->pre = p->pre;
delete p;
--size;
return OK;
}
template<class T>
Status DbList<T>::insert_val(T x)
{
DbListNode<T> *s = new DbListNode<T>;
s->data = x;
s->next = NULL;
s->pre = NULL;
DbListNode<T> *p = begin->next;
while(p!=begin && p->data<x)
{
p = p->next;
}
if(p == begin)
{
end = s;
}
s->next = p;
s->pre = p->pre;
s->pre->next = s;
p->pre = s;
++size;
return OK;
}
template<class T>
Status DbList<T>::pop_front()
{
if(IsEmpty())
{
cout<<"链表已空(pop_front)..."<<endl;
return ERROR;
}
DbListNode<T> *p = begin->next;
begin->next = p->next;
p->next->pre = begin;
delete p;
--size;
if(size == 0)
{
end = begin;
}
return OK;
}
template<class T>
Status DbList<T>::pop_back()
{
if(IsEmpty())
{
cout<<"链表已空(pop_back)..."<<endl;
return ERROR;
}
end->pre->next = begin;
begin->pre = end->pre;
delete end;
end = begin->pre;
--size;
return OK;
}
template<class T>
T DbList<T>::getLast()
{
if(begin == end)
{
cout<<"空链表无尾..."<<endl;
return NULL;
}
return end->data;
}
template<class T>
void DbList<T>::show_dblist()
{
DbListNode<T> *p = begin->next;
while(p!=begin)
{
cout<<p->data<<"==>";
p = p->next;
}
cout<<"NULL"<<endl;
}
template<class T>
T DbList<T>::getHead()
{
if(begin == end)
{
cout<<"空链表无头..."<<endl;
return NULL;
}
return begin->next->data;
}
template<class T>
Status DbList<T>::push_front(T x)
{
DbListNode<T> *s = new DbListNode<T>;
if(begin == end)
{
end = s;
}
s->data = x;
s->next = begin->next;
s->pre = begin;
begin->next = s;
s->next->pre = s;
++size;
return OK;
}
template<class T>
Status DbList<T>::push_back(T x)
{
DbListNode<T> *s = new DbListNode<T>;
s->data = x;
s->pre = end;
s->next = end->next;
end->next = s;
s->next->pre = s;
end = s;
++size;
return OK;
}
template<class T>
void DbList<T>::makeEmpty()
{
if(IsEmpty())
{
cout<<"链表已空(make empty)..."<<endl;
}
else
{
DbListNode<T> *p = begin->next;
while(p!=begin)
{
p->pre->next = p->next;
p->next->pre = p->pre;
delete p;
p = begin->next;
}
end = begin;
size = 0;
}
}
#if 1
#include"Dblist.h"
int main()
{
DbList<int> myls;
int select = 1;
while(select)
{
cout<<"||========================================||"<<endl;
cout<<"||==[1]push_front [2]push_back=======||"<<endl;
cout<<"||==[3]show_list [4]getlenth========||"<<endl;
cout<<"||==[5]getHead_val [6]getLast_val=====||"<<endl;
cout<<"||==[7]quit ===||"<<endl;
cout<<"||==[9]makeEmpty [10]pop_back=======||"<<endl;
cout<<"||==[11]pop_front [12]insert_val=====||"<<endl;
cout<<"||==[13]del_val [14]sort===========||"<<endl;
cout<<"||==[15]reverse [16]find_val_rid===||"<<endl;
cout<<"||========================================||"<<endl;
cout<<"请输入您的选择:>";
cin>>select;
system("cls");
switch(select)
{
case 1:
int val_pf;
cout<<"请输入插入的值(以-1结束):>"<<endl;
while(cin>>val_pf,val_pf!=-1)
{
myls.push_front(val_pf);
}
break;
case 2:
int val_pb;
cout<<"请输入插入的值(以-1结束):>"<<endl;
while(cin>>val_pb,val_pb!=-1)
{
myls.push_back(val_pb);
}
break;
case 3:
myls.show_dblist();
break;
case 4:
size_t size;
size = myls.getLenth();
cout<<"循环链表长度为:"<<size<<endl;
break;
case 5:
int head;
head = myls.getHead();
cout<<"该链表的第一个为:"<<head<<endl;
break;
case 6:
int last;
last = myls.getLast();
cout<<"该链表的最后一个值为:"<<last<<endl;
break;
case 7:
exit(1);
break;
case 9:
myls.makeEmpty();
break;
case 10:
myls.pop_back();
break;
case 11:
myls.pop_front();
break;
case 12:
int val_insert;
cout<<"请输入您要插入的值:>";
cin>>val_insert;
myls.insert_val(val_insert);
break;
case 13:
int val_del;
cout<<"请输入您要删除的值:>";
cin>>val_del;
myls.del_val(val_del);
break;
case 14:
myls.sort();
break;
case 15:
myls.reverse();
break;
}
}
return 0;
}
#endif