写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实现双向循环链表(完整代码)相关推荐

  1. C++ class实现单向循环链表(完整代码)

    注意: 写Delete_all要稍微注意一下,先判断tail是否为空,只有不为空时才能拿某个指针指向其next域 代码如下: #include <iostream> using names ...

  2. 数据结构-单向循环链表、双向循环链表、仿真链表

    一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...

  3. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

  4. 【数据结构】双向链表(带头双向循环链表)——超详细代码

    文章目录 1. 双链表 1.1 前言 1.2 带头双向循环链表 2. 带头双向循环链表的实现 2.1 双向链表的定义声明 2.2 双向链表的初始化 2.3 释放双向链表 2.4 打印双向链表 2.5 ...

  5. 双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法

    双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法 一.理论描述 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词 ...

  6. 双向循环链表的讲解及实现(图解+代码/C语言)

    本次为大家分享的是双向循环链表的增删查改等系列操作. 目录 一.图解双向循环链表结构 二.分步实现 (1)创建并初始化 (2)链表元素打印 (3)头插和尾插 (4)判断链表为空 (5)头删和尾删 (6 ...

  7. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  8. 数据结构与算法 | 带头双向循环链表

    上一节里实现的是最简单的链表,在实际中那种链表不会单独用来存储数据,更多是作为其他数据结构的子结构,如图的邻接表等.而比较常用的就是带头双向循环链表. 通过对比我们可以看出有三个不同,多了头节点,链表 ...

  9. 线性表:6.双向链表,可构成双向循环链表和C语言实现

    之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 "单向链表"或"单链表". 如果算法中需要频繁地找某结点 ...

最新文章

  1. Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6
  2. Upgrading PHP on CentOS 6.5 (Final)
  3. 如何使用python画折线图-Python 使用 matplotlib 画折线图教程
  4. CodeForces - 1288D Minimax Problem(二分+状态压缩)
  5. 超好看的科学科普书,孩子大人都可以看!
  6. python面试总结(五)内存管理与MYSQL引擎选择
  7. html绑定带有形参的函数,C++中函数
  8. Oracle(三):视图、序列、同义词、索引
  9. 两图说明 java 开发工具中启动类参数都是干嘛的
  10. System V与Posix
  11. 初学 Delphi 嵌入汇编[18] - SHL 与 SHR
  12. 中国机械压力机市场趋势报告、技术动态创新及市场预测
  13. studiolibrary安装_DAZ Studio 3D扩展包安装使用教程
  14. 线程之成员变量的线程共享
  15. Sketch 56.3 for Mac下载
  16. String类常用方法
  17. Pycharm打开已有项目配置python环境
  18. 计算机蜂鸣无法开机,计算机开机后会时常出现3声蜂鸣是什么原因
  19. AMD启用虚拟化(AMD-V)
  20. ffmpeg使用,读取码率和写入码率的注意事项

热门文章

  1. 【Microstation】三维建模基础及软件入门到精通实验教程目录
  2. 【Microstation】不能从对话框中装载/创建类型为 ‘HTML‘,id =41510001 的对话框条目,该对话框为: “文本编辑器 - 字处理器“,GCSDIALOG 已装载。
  3. C#创建桌面快捷方式
  4. C#实现树的双亲表示法
  5. Matlab clear, clc 和close函数
  6. Android studio之提示Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46
  7. Android之RxPermissions用kotlin写没反应
  8. linux 配置path
  9. Android之adb shell dumpsys activity获取task里面的所有actitiy
  10. php基础教程 第十步 阶段性知识补充