java循环单链表类构造函数_C++实现双向循环链表
本文实例为大家分享了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++实现双向循环链表相关推荐
- java循环单链表比较相等_java的循环单链表
packageclink;//循环单链表 public classTestClink {public static voidmain(String[] args) {//TODO Auto-gener ...
- pta 循环单链表的删除(java)
采用循环单链表做为线性表的存储结构,编写成员方法:删除运算. 删除成功,输出删除后的线性表的所有元素 删除失败,输出"error" 输入样例: 5 2 8 7 4 6 4 输出样例 ...
- python单链表类_python 链表类
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一般我们都构造双向循环链表. 二 python单向链表实现1 单项链表实现app ...
- DHU数据结构-循环单链表-ADT应用-圆桌问题
目录 1.题目 2.题解 3.代码实现 1.题目 圆桌问题 作者: 冯向阳 时间限制: 1S 章节: DS:数组和链表 问题描述 : 目的:使用C++模板设计循环链表的抽象数据类型(ADT).并在此基 ...
- java实现单链表常见操作,java面试题,java初级笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...
- 链表的基本概念以及java实现单链表-循环链表-双向链表
前言 线性结构是非常简单且常用的数据结构,而线性表则是一种非常典型的线性结构. 线性表定义 线性表的数据结构 链表 单链表 单链表的定义 单链表的插入和删除 单链表的遍历,清空,判空,获取指定结点 循 ...
- 线性表文档之循环单链表
循环单链表 定义 概念 循环单链表是在单链表的基础上,将链表最后一个结点的 next 指针域指向了链表的第一个结点(如果单链表是带头结点的则最后一个结点的 next 指针域指向头结点:如果单链表是不带 ...
- 【数据结构】循环单链表的实现(C语言)
循环单链表应掌握以下基本操作: 1.建立一个空的循环单链表. 2.获得循环单链表的最后一个结点的位置. 3.输出循环单链表中各结点的值. 4.在循环单链表中查找值为x的结点. 5.在循环单链表中第i个 ...
- 建立循环单链表(尾插法)
循环链表的操作实现算法与非循环链表的操作算法基本相同,只是对表尾的判断做了改变. 定义单链表的存储结构: typedef struct LinkList{int data;LinkList * nex ...
最新文章
- pyflink的local模式实验记录
- 信息学奥赛一本通(1248:Dungeon Master)
- 用 npm script 实现服务自动化运维
- CALL TRANSACTION 和 SUBMIT 事务码之间的跳转
- npm audit fix
- 项目中碰到的ExceptionInInitializerError异常
- 改进的自适应中值滤波算法 去除椒盐噪声 python 代码实现
- SysLoad3.exe木马病毒地分析及清除方法
- Linux下如何查看硬盘型号、序列号、缓存 CPU 主板 等信息
- 拟立法禁止采购有漏洞软件,“引爆”网络安全行业
- 如何在Centos7配置ssh/rsh免密互信集群服务
- 2020.04.08【NOIP普及组】模拟赛C组24 总结
- 在移动硬盘中,安装CentOS 7双系统
- 美国FDA注册,罐头食品FDA注册
- android 图片占用内存大小及加载解析
- php rand 生成带有小数的随机数
- win服务器时间自动变慢8小时,Deepin 20.2和Windows双系统时间相差8小时的原因及解决方法...
- 智慧商业零售商业模式是什么,智慧商业零售商业模式有那些,智慧零售数据采集维度
- 绿色免安装使用JDK和Tomcat
- 豆伴匠伴学网盘豆伴匠资源下载
热门文章
- python collections模块_Python 的collections模块
- 初学echart的简单使用
- 服务器u8系统数据库不存在,用友u8服务器端数据库不装
- mysql事务总结_MySQL数据库和相关事务总结
- python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...
- ios view添加上边框_iOS开发之如何给View添加指定位置的边框线详解
- redmine两个mysql_Redmine3.4.2安装记(Win10+MySql)
- inside uboot (六) DRAM芯片的控制线及时序
- centos 6 安装mysql,CentOS6.5安装MySQL教程(完整教程)
- 三菱d700变频器接线图_图解PLC与变频器通讯接线