双向循环链表(c++实现)

在该双向循环链表中,表头结点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;

}

你可能感兴趣的:(双向循环链表,头插法,按序插入)