双向循环链表(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;

}
时间: 2024-07-29 11:24:34

双向循环链表(c++实现)的相关文章

第33课 双向循环链表的实现

1. DTLib中双向链表的设计思路 (1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现. (2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分. 2. 实现思路 (1)通过模板定义DualCircleList类,继承自DualLinkList类 (2)在DualCircleList内部使用Linux内核链表进行实现(另类实现) (3)使用struct list_head定义DualCircleList的头结点 (4)特殊处理:循环遍历时忽略头结点

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)

双向循环链表

//双向循环链表 typedef int datatype; //方便修改 //当然也可以写成模板来适应更多的数据类型 struct dclink{ datatype data;//数据定义 struct dclink *pre; struct dclink *next;//前驱和后继指针 }; class DCLink { public: DCLink();//default constructor DCLink(datatype data);//单参constructor void add(

算法导论13:双向循环链表 2016.1.13

今天这个又打了很长时间,本来觉得数据结构就是那样,不过是一种思维,但是实际上真正自己打和想象中差距还是很大,需要考虑到各种细节. 今天这个问题有一个比较有意思的应用,就是“约瑟夫环问题”. 具体可以参见百度百科: http://baike.baidu.com/link?url=poA1Aanlptc6yzP1puYhSw_0RQjRAplhPfHwk6eoiqMNxw6WigCEbexxZ8a9SUbrMGokpPbKNzVYw308xjeEw_ 读完问题就可以发现,这个问题用链表就是一个很完美

C++__双向循环链表(练习)

双向循环链表 link.h #ifndef LINK_H_ #define LINK_H_ #define HEADER 0 #define TAIL -1 typedef int data_type; enum LINK_OP { LINK_ERR = -1, LINK_OK }; class LINK { private: LINK *last; data_type data; LINK *next; public: LINK(); LINK(data_type data); virtual

c语言编程之双向循环链表

双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define element int 4 typedef struct Node{ 5 element data; 6 struct Node *next; 7 struct Node *prior; 8 }*pNode; 9 10 //build a new double loop list 11

线性表.04.链式存储结构(双向循环链表)

以下是用双向循环链表实现的线性表 #include <stdio.h> #include <stdlib.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int ElemType;//ElemType这里假设为int,可以根据需要进行更改 typedef int Status;//Status是函数的类型,其值是函数结果状态代码,如OK等 t

小猪的数据结构辅助教程——2.7 线性表中的双向循环链表

小猪的数据结构辅助教程--2.7 线性表中的双向循环链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.了解引入双向循环链表的原因 2.熟悉双向循环链表的特点以及存储结构 3.掌握双向循环链表的一些基本操作的实现逻辑 4.掌握逆序输出双向循环链表元素逻辑 1.双向循环链表的引入 2.双向循环链表的存储结构 双向循环链表的特点: 上面也说了,空间换时间,比起循环链表只是多了一个指向前驱的指针 特点的话: 判断空表:L ->next = L -> prior = L; 存

C++双向循环链表实现

双向循环链表C++实现 1.单链表: 结构图: 2.双向链表: 3.双向循环链表: 对于本程序中,则是给定一个_head  头结点,而不是指针,因为这样更加方便避免一些空判断问题 /* 版权信息:狼 文件名称:BidCirList.h 文件标识: 文件摘要: 利用C++实现简单的双向链表功能.增,删,查,改 //太烦了..我直接给个 带头结点的 表 //swap 移花接木已经是个给力的方法..just try 当前版本:1.1 作 者:狼 完成时间:2015-12-13 */ #ifndef _

C++双向循环链表

DuLink: #include<iostream> using namespace std; typedef int elemType; typedef struct DulNode { elemType data; DulNode *prior; DulNode *next; }*DuList; void InitList(DuList *L) { *L = new DulNode; (*L)->next = (*L)->prior = *L; } int LengthList