在该双向循环链表中,表头结点first不存元素;当双向循环链表为空时:first->rlink=first->llink=first;
以下代码实现了双向循环链表的插入、删除操作;在插入操作中,实现了头插法以及按序插入法。
//main.cpp
//----------建立一个双向循环链表-------
#include<iostream>
using namespace std;
class dblist;
class dblistnode
{
friend class dblist;
private:
int data;
dblistnode *llink,*rlink;
};
class dblist
{
public:
dblist() //利用构造函数建立带有头结点(不存放元素)的循环链表
{
first=new dblistnode();
first->llink=first->rlink=first;
};
void insert1(int);
void insert2(int);
void del(int);
void show();
private:
dblistnode *first;
};
void dblist::insert1(int x) //利用头插法插入元素,注意插入步骤的顺序
{
dblistnode *p=new dblistnode();
p->data=x;
p->rlink=first->rlink; //插入步骤(1)
p->llink=first; //插入步骤(2)
first->rlink->llink=p; //插入步骤(3)
first->rlink=p; //插入步骤(4)
}
void dblist::insert2(int x) //按序插入元素,注意插入步骤的顺序
{
dblistnode *p=new dblistnode();
p->data=x;
dblistnode *q=first->rlink;
if(q==first) //当双链表为空时,在链首插入
{
p->rlink=first;
p->llink=first;
first->llink=p;
first->rlink=p;
}
else
{
while(q->rlink!=first&&q->data<=x)
{
q=q->rlink;
}
if(q->data>x) //中间插入
{
p->rlink=q; //插入步骤(1)
p->llink=q->llink; //插入步骤(2)
q->llink->rlink=p; //插入步骤(3)
q->llink=p; //插入步骤(4)
}
else //插入位置为链尾时
{
p->rlink=first;
p->llink=q;
first->llink=p;
q->rlink=p;
}
}
}
void dblist::del(int x)
{
dblistnode *q=first->rlink;
while(q!=first&&q->data!=x) //从第一个元素开始查找
{
q=q->rlink;
}
if(q!=first) //找到x
{
q->llink->rlink=q->rlink; //执行删除操作
q->rlink->llink=q->llink;
delete q;
}
else
{
cout<<"找不到x,不能删除"<<endl;
}
}
void dblist::show()
{
dblistnode *p=first->rlink;
cout<<"链表元素为:";
while(p!=first)
{
cout<<p->data<<" ";
p=p->rlink;
}
cout<<endl;
}
int main()
{
dblist L1,L2;
L1.insert1(60);
L1.insert1(50);
L1.insert1(40);
L1.insert1(30);
L1.show();
cout<<"删除元素40后"<<endl;
L1.del(40);
L1.show();
L2.insert2(60);
L2.insert2(50);
L2.insert2(40);
L2.insert2(30);
L2.show();
cout<<"删除元素40后"<<endl;
L2.del(40);
L2.show();
system("pause");
return 0;
}