C++ class实现双向循环链表(完整代码)
写Delete_all的时候注意一下就好了,先判断空白头结点是不是为NULL
代码如下:
#include <iostream>
using namespace std;
typedef int ElemType;
#define NO 0class Node {friend class LinkList;public:Node(): next(NULL), prior(NULL) {};private:ElemType data;Node *next;Node *prior;
};class LinkList {public:LinkList(): head(NULL) {};~LinkList() {Delete_all();}void Init();void TailCreateList(int n);Node *Locate_i(int i);Node *Locate_e(ElemType e);ElemType Get(int i);bool Insert(ElemType e, int i);bool Delete(int i);void Delete_all();void PrintList();private:Node *head;
};void LinkList::Init() {Delete_all();head = NULL;
}void LinkList::TailCreateList(int n) {Node *p, *s, *r;Delete_all();p = new Node();r = p;for (int i = 1; i <= n; i++) {s = new Node();cin >> s->data;r->next = s;s->prior = r;r = s;}r->next = p;p->prior = r;head = p;
}Node *LinkList::Locate_i(int i) {if (i == 0)return head;Node *p;p = head->next;int j = 1;while ((p != head) && (j < i)) {j++;p = p->next;}if (i == j)return p;else {cout << "position is not correct!!!" << endl;return NULL;}
}Node *LinkList::Locate_e(ElemType e) {Node *p;p = head->next;while ((p != head) && (p->data != e))p = p->next;if (p != head)return p;else {cout << e << " is not exist!!!" << endl;return NULL;}
}bool LinkList::Insert(ElemType e, int i) {Node *p, *s;p = Locate_i(i - 1);if (p != NULL) {s = new Node();s->data = e;s->next = p->next;p->next->prior = s;p->next = s;s->prior = p;return true;} else {cout << "position is not correct!!!" << endl;return false;}
}bool LinkList::Delete(int i) {Node *p;p = Locate_i(i);if (p != NULL) {p->prior->next = p->next;p->next->prior = p->prior;delete p;return true;} else {cout << "position is not correct!!!" << endl;return false;}
}ElemType LinkList::Get(int i) {Node *p;p = head->next;int j = 1;while ((p != head) && (j < i)) {j++;p = p->next;}if (j == i)return p->data;else {cout << "position is not correct!!!" << endl;return NO;}
}void LinkList::Delete_all() {Node *p, *q;p = head;if (p == NULL) {head = NULL;return;}q = p->prior;q->next = NULL;while (p != NULL) {q = p->next;delete p;p = q;}head = NULL;
}void LinkList::PrintList() {Node *p;p = head->next;while (p != head) {cout << p->data << " ";p = p->next;}cout << endl;
}int main() {LinkList l;l.Init();int n;cin >> n;l.TailCreateList(n);l.PrintList();l.Insert(30, 3);l.PrintList();l.Delete(4);l.PrintList();cout << l.Get(2) << endl;l.PrintList();return 0;
}
测试结果:
C++ class实现双向循环链表(完整代码)相关推荐
- C++ class实现单向循环链表(完整代码)
注意: 写Delete_all要稍微注意一下,先判断tail是否为空,只有不为空时才能拿某个指针指向其next域 代码如下: #include <iostream> using names ...
- 数据结构-单向循环链表、双向循环链表、仿真链表
一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...
- 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题
循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...
- 【数据结构】双向链表(带头双向循环链表)——超详细代码
文章目录 1. 双链表 1.1 前言 1.2 带头双向循环链表 2. 带头双向循环链表的实现 2.1 双向链表的定义声明 2.2 双向链表的初始化 2.3 释放双向链表 2.4 打印双向链表 2.5 ...
- 双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法
双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法 一.理论描述 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词 ...
- 双向循环链表的讲解及实现(图解+代码/C语言)
本次为大家分享的是双向循环链表的增删查改等系列操作. 目录 一.图解双向循环链表结构 二.分步实现 (1)创建并初始化 (2)链表元素打印 (3)头插和尾插 (4)判断链表为空 (5)头删和尾删 (6 ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- 数据结构与算法 | 带头双向循环链表
上一节里实现的是最简单的链表,在实际中那种链表不会单独用来存储数据,更多是作为其他数据结构的子结构,如图的邻接表等.而比较常用的就是带头双向循环链表. 通过对比我们可以看出有三个不同,多了头节点,链表 ...
- 线性表:6.双向链表,可构成双向循环链表和C语言实现
之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 "单向链表"或"单链表". 如果算法中需要频繁地找某结点 ...
最新文章
- Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6
- Upgrading PHP on CentOS 6.5 (Final)
- 如何使用python画折线图-Python 使用 matplotlib 画折线图教程
- CodeForces - 1288D Minimax Problem(二分+状态压缩)
- 超好看的科学科普书,孩子大人都可以看!
- python面试总结(五)内存管理与MYSQL引擎选择
- html绑定带有形参的函数,C++中函数
- Oracle(三):视图、序列、同义词、索引
- 两图说明 java 开发工具中启动类参数都是干嘛的
- System V与Posix
- 初学 Delphi 嵌入汇编[18] - SHL 与 SHR
- 中国机械压力机市场趋势报告、技术动态创新及市场预测
- studiolibrary安装_DAZ Studio 3D扩展包安装使用教程
- 线程之成员变量的线程共享
- Sketch 56.3 for Mac下载
- String类常用方法
- Pycharm打开已有项目配置python环境
- 计算机蜂鸣无法开机,计算机开机后会时常出现3声蜂鸣是什么原因
- AMD启用虚拟化(AMD-V)
- ffmpeg使用,读取码率和写入码率的注意事项
热门文章
- 【Microstation】三维建模基础及软件入门到精通实验教程目录
- 【Microstation】不能从对话框中装载/创建类型为 ‘HTML‘,id =41510001 的对话框条目,该对话框为: “文本编辑器 - 字处理器“,GCSDIALOG 已装载。
- C#创建桌面快捷方式
- C#实现树的双亲表示法
- Matlab clear, clc 和close函数
- Android studio之提示Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46
- Android之RxPermissions用kotlin写没反应
- linux 配置path
- Android之adb shell dumpsys activity获取task里面的所有actitiy
- php基础教程 第十步 阶段性知识补充