本文实例为大家分享了C++实现双向循环链表的具体代码,供大家参考,具体内容如下

一、概念

1.在双链表中的每个结点应有两个链接指针:

lLink -> 指向前驱结点  (前驱指针或者左链指针)

rLink->指向后继结点(后驱指针或者右链指针)

2.双链表常采用带附加头结点的循环链表方式:

first:头指针,不存放数据,或者存放特殊要求的数据。它的lLink指向双链表的尾结点(最后一个结点),

它的rLink指向双链表的首结点(第一个有效结点)。链表的首结点的左链指针lLink和尾结点的右链指针

rLink都指向附加头结点。

二、实现程序

1.DblList.h

#ifndef DblList_h

#define DblList_h

#include

using namespace std;

template

struct DblNode { // 链表结点定义

T data;

DblNode *lLink, *rLink; // 链表前驱(左链)和后继(右链)指针

DblNode(DblNode *left = NULL, DblNode *right = NULL):lLink(left), rLink(right){} // 构造函数

DblNode(T value, DblNode *left = NULL, DblNode *right = NULL):data(value), lLink(left), rLink(right){} // 构造函数

};

template

class DblList { // 双链表(双向循环链表)

public:

DblList(); // 构造函数:建立附加头结点

~DblList(); // 析构函数:释放所有存储

void createDblList(); // 创建双向链表

int Length()const; // 计算双链表的长度

bool isEmpty(); // 判双链表空否

DblNode *getHead()const; // 取附加头结点

void setHead(DblNode *ptr); // 设置附加头结点地址

DblNode *Search(const T x); // 在链表中沿后继方向寻找等于给定值x的结点

DblNode *Locate(int i, int d); // 在链表中定位第i个结点,d=0按前驱方向,否则按后继方向

bool Insert(int i, const T x, int d); // 在第i个结点后插入x,d=0按前驱方向,否则按后继方向

bool Remove(int i, T &x, int d); // 删除第i个结点,x带回删除其值,d=0按前驱方向,否则按后继方向

void Output(); // 输出双链表中的数据

private:

DblNode *first; // 附加头结点

};

template

DblList::DblList() {

// 构造函数:建立附加头结点

first = new DblNode();

if(NULL == first) {

cerr << "动态分配内存空间失败!" << endl;

exit(1);

}

first->rLink = first->lLink = first; // 指向自身

}

template

DblList::~DblList() { // 析构函数:释放所有存储

DblNode *current = first->rLink;

while(current != first) {

current->rLink->lLink = current->lLink; // 从lLink链中摘下

current->lLink->rLink = current->rLink; // 从rLink链中摘下

delete current; // 释放空间

current = first->rLink;

}

delete first;

first = NULL;

}

template

void DblList::createDblList() {

// 创建双向链表

int n, val;

DblNode *current = first;

cout << "请输入要输入的个数n:";

cin >> n;

cout << "请输入要输入的数:" << endl;

for(int i = 0; i < n; i++) {

cin >> val;

DblNode *newNode = new DblNode(val);

if(NULL == newNode) {

cerr << "动态分配内存空间失败!" << endl;

exit(1);

}

// 尾插入

while(current->rLink != first)

current = current->rLink; // 往后继方向移动

newNode->rLink = current->rLink;

current->rLink = newNode;

newNode->rLink->lLink = newNode;

newNode->lLink = current;

current = current->rLink; // current往后移

}

}

template

int DblList::Length()const {

// 计算双链表的长度

DblNode *current = first->rLink;

int count = 0;

while(current != first) {

current = current->rLink;

count++;

}

return count;

}

template

bool DblList::isEmpty() {

// 判双链表空否

return first->rLink == first;

}

template

DblNode *DblList::getHead()const {

// 取附加头结点

return first;

}

template

void DblList::setHead(DblNode *ptr) {

// 设置附加头结点地址

first = ptr;

}

template

DblNode *DblList::Search(const T x) {

// 在链表中沿后继方向寻找等于给定值x的结点

DblNode *current = first->rLink;

while(current != first && current->data != x)

current = current->rLink;

if(current != first)

return current; // 搜索成功

else // 搜索失败

return NULL;

}

template

DblNode *DblList::Locate(int i, int d) {

// 定位

if((first->rLink == first) || (i = 0))

return first;

DblNode *current;

if(d == 0)

current = first->lLink; // 搜索前驱方向

else

current = first->rLink;

for(int j = 1; j < i; j++)

{

if(current == first)

break;

else if(d == 0)

current = current->lLink;

else

current = current->rLink;

}

if(current != first) // 定位成功

return current;

else

return NULL;

}

template

bool DblList::Insert(int i, const T x, int d) {

// 插入

DblNode *current = Locate(i, d); // 查找第i个结点

if(current == NULL) // i不合理,插入失败

return false;

DblNode *newNode = new DblNode(x);

if(newNode == NULL) {

cerr << "内存空间分配失败!" << endl;

exit(1);

}

if(d == 0) { // 前驱方向插入

newNode->lLink = current->lLink;

current->lLink = newNode;

newNode->lLink->rLink = newNode;

newNode->rLink = current;

}

else { // 后继方向插入

newNode->rLink = current->rLink;

current->rLink = newNode;

newNode->rLink->lLink = newNode;

newNode->lLink = current;

}

return true;

}

template

bool DblList::Remove(int i, T &x, int d) {

// 删除

DblNode *current = Locate(i, d); // 查找第i个结点

if(current == NULL) // i不合理,插入失败

return false;

current->rLink->lLink = current->lLink; // 从lLink链中摘下

current->lLink->rLink = current->rLink; // 从rLink链中摘下

x = current->data;

delete current; // 释放空间

current = NULL; // 指向空

return true; // 删除成功

}

template

void DblList::Output() {

// 输出双链表中的数据

DblNode *current = first->rLink;

while(current != first) {

cout << current->data << " ";

current = current->rLink;

}

cout << endl;

}

#endif /* DblList_h */

2.main.cpp

#include "DblList.h"

using namespace std;

int main(int argc, const char * argv[]) {

int finished = 0, choice, i, x, d, len; // i存储第i个,d:存储方向 -》0表示前驱方向,否则为后继方向

DblList L;

DblNode *head = NULL, *current;

while(!finished) {

cout << "\n*********菜单*********\n";

cout << "1:建立双链表\n";

cout << "2:双链表的长度\n";

cout << "3:双链表是否为空?\n";

cout << "4:取附加头结点\n";

cout << "5:设置附加头结点地址\n";

cout << "6:在链表中沿后继方向寻找等于给定值x的结点\n";

cout << "7:在链表中定位第i个结点,d=0按前驱方向,否则按后继方向\n";

cout << "8:在第i个结点后插入x,d=0按前驱方向,否则按后继方向\n";

cout << "9:删除第i个结点,x带回删除其值,d=0按前驱方向,否则按后继方向\n";

cout << "10:输出双链表中的数据:\n";

cout << "11:退出\n";

cout << "请输入选择[1-11]:\n";

cin >> choice;

switch(choice) {

case 1:

L.createDblList(); // 建立双链表

break;

case 2:

len = L.Length(); // 双链表的长度

cout << "双链表的长度为:" << len << endl;

break;

case 3:

if(L.isEmpty()) // 双链表是否为空

cout << "双链表为空" << endl;

else

cout << "双链表不空" << endl;

break;

case 4:

head = L.getHead();

break;

case 5:

L.setHead(head); // 设置附加头结点地址

break;

case 6:

cout << "请输入要查找的值x:";

cin >> x;

if(L.Search(x) != NULL)

cout << "查找成功!" << endl;

else

cout << "查找失败!" << endl;

break;

case 7:

cout << "请输入要定位第i个结点的i和方向d(d=0按前驱方向,否则按后继方向):";

cin >> i >> d;

current = L.Locate(i, d);

if(current == NULL)

cout << "定位失败!" << endl;

else

cout << "定位成功!" << endl;

break;

case 8:

cout << "在第i个结点后插入x,d=0按前驱方向,否则按后继方向。请输入i, x和d:";

cin >> i >> x >> d;

if(L.Insert(i, x, d))

cout << "插入成功!" << endl;

else

cout << "插入失败!" << endl;

break;

case 9:

cout << "删除第i个结点,x带回删除其值,d=0按前驱方向,否则按后继方向。请输入i和d:";

cin >> i >> d;

if(L.Remove(i, x, d))

cout << "删除成功,删除的值为:" << x << endl;

else

cout << "删除失败!" << endl;

break;

case 10:

cout << "双链表中的数据为:" << endl;

L.Output();

break;

case 11:

finished = 1;

break;

default:

cout << "输入错误, 请重新输入!" << endl;

} // switch

} // while

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java循环单链表类构造函数_C++实现双向循环链表相关推荐

  1. java循环单链表比较相等_java的循环单链表

    packageclink;//循环单链表 public classTestClink {public static voidmain(String[] args) {//TODO Auto-gener ...

  2. pta 循环单链表的删除(java)

    采用循环单链表做为线性表的存储结构,编写成员方法:删除运算. 删除成功,输出删除后的线性表的所有元素 删除失败,输出"error" 输入样例: 5 2 8 7 4 6 4 输出样例 ...

  3. python单链表类_python 链表类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一般我们都构造双向循环链表. 二 python单向链表实现1 单项链表实现app ...

  4. DHU数据结构-循环单链表-ADT应用-圆桌问题

    目录 1.题目 2.题解 3.代码实现 1.题目 圆桌问题 作者: 冯向阳 时间限制: 1S 章节: DS:数组和链表 问题描述 : 目的:使用C++模板设计循环链表的抽象数据类型(ADT).并在此基 ...

  5. java实现单链表常见操作,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  6. 链表的基本概念以及java实现单链表-循环链表-双向链表

    前言 线性结构是非常简单且常用的数据结构,而线性表则是一种非常典型的线性结构. 线性表定义 线性表的数据结构 链表 单链表 单链表的定义 单链表的插入和删除 单链表的遍历,清空,判空,获取指定结点 循 ...

  7. 线性表文档之循环单链表

    循环单链表 定义 概念 循环单链表是在单链表的基础上,将链表最后一个结点的 next 指针域指向了链表的第一个结点(如果单链表是带头结点的则最后一个结点的 next 指针域指向头结点:如果单链表是不带 ...

  8. 【数据结构】循环单链表的实现(C语言)

    循环单链表应掌握以下基本操作: 1.建立一个空的循环单链表. 2.获得循环单链表的最后一个结点的位置. 3.输出循环单链表中各结点的值. 4.在循环单链表中查找值为x的结点. 5.在循环单链表中第i个 ...

  9. 建立循环单链表(尾插法)

    循环链表的操作实现算法与非循环链表的操作算法基本相同,只是对表尾的判断做了改变. 定义单链表的存储结构: typedef struct LinkList{int data;LinkList * nex ...

最新文章

  1. pyflink的local模式实验记录
  2. 信息学奥赛一本通(1248:Dungeon Master)
  3. 用 npm script 实现服务自动化运维
  4. CALL TRANSACTION 和 SUBMIT 事务码之间的跳转
  5. npm audit fix
  6. 项目中碰到的ExceptionInInitializerError异常
  7. 改进的自适应中值滤波算法 去除椒盐噪声 python 代码实现
  8. SysLoad3.exe木马病毒地分析及清除方法
  9. Linux下如何查看硬盘型号、序列号、缓存 CPU 主板 等信息
  10. 拟立法禁止采购有漏洞软件,“引爆”网络安全行业
  11. 如何在Centos7配置ssh/rsh免密互信集群服务
  12. 2020.04.08【NOIP普及组】模拟赛C组24 总结
  13. 在移动硬盘中,安装CentOS 7双系统
  14. 美国FDA注册,罐头食品FDA注册
  15. android 图片占用内存大小及加载解析
  16. php rand 生成带有小数的随机数
  17. win服务器时间自动变慢8小时,Deepin 20.2和Windows双系统时间相差8小时的原因及解决方法...
  18. 智慧商业零售商业模式是什么,智慧商业零售商业模式有那些,智慧零售数据采集维度
  19. 绿色免安装使用JDK和Tomcat
  20. 豆伴匠伴学网盘豆伴匠资源下载

热门文章

  1. python collections模块_Python 的collections模块
  2. 初学echart的简单使用
  3. 服务器u8系统数据库不存在,用友u8服务器端数据库不装
  4. mysql事务总结_MySQL数据库和相关事务总结
  5. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...
  6. ios view添加上边框_iOS开发之如何给View添加指定位置的边框线详解
  7. redmine两个mysql_Redmine3.4.2安装记(Win10+MySql)
  8. inside uboot (六) DRAM芯片的控制线及时序
  9. centos 6 安装mysql,CentOS6.5安装MySQL教程(完整教程)
  10. 三菱d700变频器接线图_图解PLC与变频器通讯接线