雙向循環鏈表(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;

}
發佈了64 篇原創文章 · 獲贊 29 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章