//dou_circular_linklist.h
#ifndef DOU_CIRCULAR_LINKLIST
#define DOU_CIRCULAR_LINKLIST
#include <iostream>
using namespace std;
template <class T>
struct Node
{
T data;
Node<T>*prior,*next;
};
template <class T>
class Dou_Circular_Linklist
{
public:
Dou_Circular_Linklist();
Dou_Circular_Linklist(T a[],int n);
~Dou_Circular_Linklist();
void Printlist();
void Get(int n);
int Locate(T x);
void Insert(int n,T x);
T Delete(int n);
private:
Node<T>* first;
};
template <class T>
Dou_Circular_Linklist<T>::Dou_Circular_Linklist()
{
first =new Node<T>;
first->next=first;
first->prior=first;
}
template <class T>
Dou_Circular_Linklist<T>::Dou_Circular_Linklist(T a[],int n)
{
Node<T>*f,*s;
first=new Node<T>;
f=first;
for(int i=0;i<n;i++)
{
s=new Node<T>;
s->data=a[i];
s->prior=f;
f->next=s;
f=f->next;
}
f->next=first;
first->prior=f;
}
template <class T>
void Dou_Circular_Linklist<T>::Printlist()
{
cout<<"按顺序输出循环双链表:";
Node<T>*p=first->next;
while(p!=first)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl<<endl;
cout<<"按倒序输出循环双链表:";
p=first->prior;
while(p!=first)
{
cout<<p->data<<" ";
p=p->prior;
}
cout<<endl;
}
template <class T>
void Dou_Circular_Linklist<T>::Get(int n)
{
if(n==0) throw "头结点没有数据";
Node<T>*p=first;
for(int i=1;i<=n;i++)
{
if((i+1)%6==0) p=p->next;
p=p->next;
}
cout<<p->data<<endl;
}
template <class T>
void Dou_Circular_Linklist<T>::Insert(int n,T x)
{
Node<T>*p=first;
int count=0;
while(count<n-1)
{
p=p->next;
count++;
}
Node<T>*s=new Node<T>;
s->data=x;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
}
template <class T>
int Dou_Circular_Linklist<T>::Locate(T x)
{
Node<T>*p=first->next;
int count=1;
while(p!=first)
{
if(p->data==x) return count;
p=p->next;
count++;
}
return 0;
}
template <class T>
T Dou_Circular_Linklist<T>::Delete(int n)
{
Node<T>*q=first->next;
int count=1,x;
while(count<n)
{
q=q->next;
count++;
}
x=q->data;
q->prior->next=q->next;
q->next->prior=q->prior;
delete q;
return x;
}
template <class T>
Dou_Circular_Linklist<T>::~Dou_Circular_Linklist()
{
while(first!=first)
{
Node<T>*q=first;
first=first->next;
delete q;
}
delete first;
}
#endif
//main.cpp
#include "dou_circular_linklist.h"
void main()
{
int a[5]={1,2,3,4,5};
Dou_Circular_Linklist<int> d(a,5);
d.Printlist();
try
{
cout<<"\n按顺序数数,数到第11个数为多少?(循环):";
d.Get(11);
}
catch(char*) {cout<<"\n头结点没有数据"<<endl;}
cout<<"在第三个位置上插入9这个数据"<<endl<<endl;
d.Insert(3,9);
d.Printlist();
cout<<"\n4在线性表中第几个位置上?"<<endl;
cout<<d.Locate(4)<<endl;
cout<<"\n删除线性表的第三个元素"<<endl;
cout<<"\n删除的元素为:"<<d.Delete(3)<<endl<<endl;
d.Printlist();
}
程序结果: