线性表之双向循环链表
2012-05-24 15:30:29 来源:WEB开发网核心提示:#include<iostream>using namespace std;template<typename T>struct node{T data;node<T> *prior,*next;};template<typename T> class DLink{pri
#include<iostream>
using namespace std;
template<typename T>struct node{
T data;
node<T> *prior,*next;
};
template<typename T> class DLink{
private:
node<T> *head;
public:
DLink()
{
head=new node<T>;
head->next=head->prior=head;
}
~DLink()
{
clearLink();
delete head;
}
void clearLink()
{
node<T> *p=head->next;
while(p!=head)
{
p=p->next;
delete p->prior;
}
head->prior=head->next=head;
}
bool empty()
{
return head->next==head;
}
int linkLength()
{
node<T> *p=head->next;
int i=0;
while(p!=head)
{
i++;
p=p->next;
}
return i;
}
bool getElem(int i,T &e)
{
if(i<1 || i>linkLength())
return false;
node <T> *p=head->next;
int j=1;
while(j<i)
{
j++;
p=p->next;
}
e=p->data;
return true;
}
bool Insert(int i,T e)
{
if(i<1 || i> linkLength()+1)
return false;
node<T> *s,*p=head;
int j=0;
s=new node<T>;
s->data=e;
while(j<i-1)
{
j++;
p=p->next;
}
s->next=p->next;
s->prior=p;
p->next->prior=s;
p->next=s;
return true;
}
bool Delete(int i,T &e)
{
if(i<1 || i>linkLength())
return false;
node<T> *p=head->next;
int j=0;
while(j<i-1)
{
j++;
p=p->next;
}
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return true;
}
void print()
{
node<T> *p=head->next;
while(p!=head)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template<class T>
friend ostream & operator <<(ostream &,DLink<T> &);
template<class T>
friend void MergeLink(DLink<T>&,DLink<T>&);
template<class T>
friend void MergeLink(DLink<T>&,DLink<T>&,DLink<T>&);
};
template<class T>
ostream & operator <<(ostream & out ,DLink<T> & a)
{
node<T> *p=a.head->next;
while(p!=a.head)
{
out<<p->data<<" ";
p=p->next;
}
out<<endl;
return out;
}
template<class T>
void MergeLink(DLink<T>&a,DLink<T>&b)
{
node<T>*pa,*pb,*p;
pa=a.head->next;
pb=b.head->next;
p=a.head;
while(pa!=a.head && pb!=b.head)
{
if(pa->data<=pb->data)
{
p->next=pa;
pa->prior=p;
p=pa;
pa=pa->next;
}
else {
p->next=pb;
pb->prior=p;
p=pb;
pb=pb->next;
}
}
while(pa!=a.head)
{
p->next=pa;
pa->prior=p;
p=pa;
pa=pa->next;
}
while(pb!=b.head)
{
p->next=pb;
pb->prior=p;
p=pb;
pb=pb->next;
}
p->next=a.head;
a.head->prior=p;
b.head->next=b.head->prior=b.head;
}
template<class T>
void MergeLink(DLink<T>&a,DLink<T>&b,DLink<T>&c)
{
node<T> *pa,*pb,*p;
pa=a.head->next;
pb=b.head->next;
int i=1,j=1,k=0;
T ai,bj;
while(pa!=a.head && pb!=b.head)
{
a.getElem(i,ai);
b.getElem(j,bj);
if(ai<=bj)
{
c.Insert(++k,ai);
i++;
pa=pa->next;
}
else {
c.Insert(++k,bj);
j++;
pb=pb->next;
}
}
while(pa!=a.head)
{
a.getElem(i++,ai);
pa=pa->next;
c.Insert(++k,ai);
}
while(pb!=b.head)
{
b.getElem(j++,bj);
pb=pb->next;
c.Insert(++k,bj);
}
}
int main()
{
DLink<int> La,Lb,Lc;
cout<<boolalpha<<La.empty()<<endl;
for(int i=1;i<4;i++)
La.Insert(i,i);
for(int i=1;i<4;i++)
Lb.Insert(i,i+1);
//cout<<boolalpha<<La.empty()<<endl;
//La.print();
//cout<<La<<"链表La的长度是:"<<La.linkLength()<<endl;
//cout<<Lb<<"链表的Lb长度是:"<<Lb.linkLength()<<endl;
//cout<<"链表的长度是:"<<La.linkLength()<<endl;
int e;
for(int i=1;i<5;i++)
{
La.getElem(i,e);
cout<<e<<" ";
}
cout<<endl;
while(!La.empty())
{
La.Delete(La.linkLength(),e);
La.print();
}
//MergeLink(La,Lb);
MergeLink(La,Lb,Lc);
cout<<La<<"链表La的长度是:"<<La.linkLength()<<endl;
cout<<Lb<<"链表的Lb长度是:"<<Lb.linkLength()<<endl;
cout<<Lc<<"链表的Lc长度是:"<<Lc.linkLength()<<endl;
return 0;
}
- ››线性回归拟合线Trend函数是这样来使用的
- ››线性表之双向循环链表
- ››线性表之单循环链表
- ››线性表之单链表
- ››线性表之顺序表
- ››循环不间断向上滚动的文本特效代码
- ››循环链表实验
- ››线性表的顺序存储实验
- ››双向链表的排序
- ››线性表的使用
- ››双向链表&&堆栈
- ››循环复用DNS实现多服务器的负载均衡
更多精彩
赞助商链接
