/********************************线性表抽象类的定义***************************/
template <class dataType>
class list{
public:
virtual void empty()=0; //清空线性表
virtual int getLength()=0; //求表的长度
virtual void insert(int i,const dataType& x)=0; //在表中第i个位置插入值为x的元素
virtual void remove(int i)=0; //删除表中第i个位置的元素
virtual int search(const dataType& x)=0; //查找并返回值为x的元素在表中的位置
virtual dataType visit(int i)=0; //访问表中第i个元素的值
virtual void traverse()=0; //遍历线性表
};
/*******************************双链表类的定义********************************/
template <class dataType>
class dLinkList:public list<dataType>{ //公有继承自list类
public:
dLinkList(); //构造函数,创建对象时生成空链表
void empty(); //清空链表(除头尾节点以外)
int getLength(); //求链表的长度
void insert(int i,const dataType& x); //在表中第i个位置插入值为x的元素
void remove(int i); //删除表中第i个节点
int search(const dataType& x); //查找并返回值为x的元素在表中的位置
dataType visit(int i); //访问表中第i个元素的值
void traverse(); //将表中的元素逐一输出
~dLinkList(); //析构函数
private:
//定义节点
struct node{
dataType data; //节点中保存的数据
node* prior; //节点的前驱
node* next; //节点的后继
node():prior(NULL),next(NULL){}; //构造函数
node(dataType d):data(d),prior(NULL),next(NULL){}; //构造函数
};
node* head; //链表头
node* tail; //链表尾
int currentLength; //链表长度
};
/*********************************双链表类的实现******************************/
template <class dataType>
dLinkList<dataType>::dLinkList(){
head=new node;
tail=new node;
head->prior=NULL,head->next=tail;
tail->prior=head;
currentLength=0;
cout<<"\nCreate list success!\n";
}
template <class dataType>
void dLinkList<dataType>::empty(){
node* nowPos=head->next;
while(nowPos!=tail){
node* tmp=nowPos;
nowPos=nowPos->next;
delete tmp;
}
head->next=tail;
tail->prior=head;
currentLength=0;
cout<<"\nEmpty list success!\n";
}
template <class dataType>
int dLinkList<dataType>::getLength(){
return currentLength;
}
template <class dataType>
void dLinkList<dataType>::insert(int i,const dataType& x){
if(i<0||i>currentLength){
cout<<"\nThe index is out of range!\n";
return;
}
node* add=new node(x);
if(i==0){
add->next=head->next,head->next->prior=add;
add->prior=head,head->next=add;
}
else{
//找到第i-1个节点
node* nowPos=head->next;
while(--i){
nowPos=nowPos->next;
}
add->prior=nowPos,add->next=nowPos->next;
nowPos->next->prior=add,nowPos->next=add;
}
++currentLength;
cout<<"\nInsert data success!\n";
}
template <class dataType>
void dLinkList<dataType>::remove(int i){
if(i<0||i>=currentLength){
cout<<"\nThe index is out of range!\n";
return;
}
//找到第i个节点
node* nowPos=head->next;
while(i--){
nowPos=nowPos->next;
}
nowPos->prior->next=nowPos->next;
nowPos->next->prior=nowPos->prior;
delete nowPos;
--currentLength;
cout<<"\nDelete data success!\n";
}
template <class dataType>
int dLinkList<dataType>::search(const dataType& x){
node* nowPos=head;
int i;
for(i=0;i<currentLength;++i){
nowPos=nowPos->next;
if(nowPos->data==x) break;
}
if(i==currentLength) return -1;
return i;
}
template <class dataType>
dataType dLinkList<dataType>::visit(int i){
//i越界时抛出异常值0
if(i<0||i>=currentLength){
throw 0;
}
//找到第i个节点
node* nowPos=head->next;
while(i--){
nowPos=nowPos->next;
}
return nowPos->data;
}
template <class dataType>
void dLinkList<dataType>::traverse(){
if(currentLength==0){
cout<<"\nThe list is empty!\n";
return;
}
node* nowPos=head->next;
cout<<nowPos->data;
nowPos=nowPos->next;
while(nowPos!=tail){
cout<<" "<<nowPos->data;
nowPos=nowPos->next;
}
cout<<endl;
}
template <class dataType>
dLinkList<dataType>::~dLinkList(){
empty();
delete head;
delete tail;
}
C++类模板实现双链表
最新推荐文章于 2020-09-23 01:32:03 发布