http://blog.csdn.net/fisherwan/article/details/25649271

链表(四)实现双向循环链表简单操作,代码如下:

[cpp] view plain copy
  1. <span style="font-size:18px;" deep="5">#include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. //结点类
  5. class Node {
  6. public:
  7. int data;
  8. Node *pPre, *pNext;
  9. };
  10. //双向循环链表类
  11. class DoubleCircularLinkList {
  12. public:
  13. DoubleCircularLinkList() {
  14. head = new Node;
  15. head->data = 0;
  16. head->pNext = head;
  17. head->pPre = head;
  18. }
  19. ~DoubleCircularLinkList() {delete head;}
  20. void CreateLinkList(int n);
  21. void InsertNode(int position, int d);
  22. void TraverseLinkList();
  23. bool IsEmpty();
  24. int GetLength();
  25. void DeleteNode(int posiiton);
  26. void DeleteLinkList();
  27. private:
  28. Node *head;
  29. };
  30. void DoubleCircularLinkList::CreateLinkList(int n) {
  31. if (n < 0) {
  32. cout << "输入结点个数错误!" << endl;
  33. exit(EXIT_FAILURE);
  34. }
  35. else {
  36. int i = 0;
  37. Node *pnew, *ptemp;
  38. ptemp = head;
  39. i = n;
  40. while (n-- > 0) {
  41. pnew = new Node;
  42. cout << "输入第" << i - n << "个结点:";
  43. cin >> pnew->data;
  44. pnew->pNext = head;
  45. pnew->pPre = ptemp;
  46. ptemp->pNext = pnew;
  47. ptemp = pnew;
  48. }
  49. }
  50. }
  51. void DoubleCircularLinkList::InsertNode(int position, int d) {
  52. if (position < 0 || position > GetLength() + 1) {
  53. cout << "输入位置错误!" << endl;
  54. exit(EXIT_FAILURE);
  55. }
  56. else {
  57. Node *pnew, *ptemp;
  58. pnew = new Node;
  59. pnew->data = d;
  60. ptemp = head;
  61. while (position-- > 1)
  62. ptemp = ptemp->pNext;
  63. pnew->pNext = ptemp->pNext;
  64. pnew->pPre = ptemp;
  65. ptemp->pNext = pnew;
  66. ptemp = pnew;
  67. }
  68. }
  69. void DoubleCircularLinkList::TraverseLinkList() {
  70. Node *ptemp = head->pNext;
  71. while(ptemp != head) {
  72. cout << ptemp->data << " ";
  73. ptemp = ptemp->pNext;
  74. }
  75. cout << endl;
  76. }
  77. bool DoubleCircularLinkList::IsEmpty() {
  78. if (head == head->pNext)
  79. return true;
  80. else
  81. return false;
  82. }
  83. int DoubleCircularLinkList::GetLength() {
  84. int n = 0;
  85. Node *ptemp = head->pNext;
  86. while (ptemp != head) {
  87. n++;
  88. ptemp = ptemp->pNext;
  89. }
  90. return n;
  91. }
  92. void DoubleCircularLinkList::DeleteNode(int position) {
  93. if (position < 0 || position > GetLength()) {
  94. cout << "输入位置错误!" << endl;
  95. exit(EXIT_FAILURE);
  96. }
  97. else {
  98. Node *pdelete, *ptemp;
  99. ptemp = head;
  100. while (position-- > 1)
  101. ptemp = ptemp->pNext;
  102. pdelete = ptemp->pNext;
  103. ptemp->pNext = pdelete->pNext;
  104. pdelete->pNext->pPre = ptemp;
  105. delete pdelete;
  106. pdelete = NULL;
  107. }
  108. }
  109. void DoubleCircularLinkList::DeleteLinkList() {
  110. Node *pdelete, *ptemp;
  111. pdelete = head->pNext;
  112. while (pdelete != head) {
  113. ptemp = pdelete->pNext;
  114. head->pNext = ptemp;
  115. ptemp->pPre = head;
  116. delete pdelete;
  117. pdelete = ptemp;
  118. }
  119. }
  120. //测试函数
  121. int main() {
  122. DoubleCircularLinkList dcl;
  123. int position = 0, value = 0, n = 0;
  124. bool flag = false;
  125. cout << "请输入需要创建双向循环链表的结点个数:";
  126. cin >> n;
  127. dcl.CreateLinkList(n);
  128. cout << "打印链表值如下:";
  129. dcl.TraverseLinkList();
  130. cout << "请输入插入结点的位置和值:";
  131. cin >> position >> value;
  132. dcl.InsertNode(position, value);
  133. cout << "打印链表值如下:";
  134. dcl.TraverseLinkList();
  135. cout << "请输入要删除结点的位置:";
  136. cin >> position;
  137. dcl.DeleteNode(position);
  138. cout << "打印链表值如下:";
  139. dcl.TraverseLinkList();
  140. dcl.DeleteLinkList();
  141. flag = dcl.IsEmpty();
  142. if (flag)
  143. cout << "删除链表成功!" << endl;
  144. else
  145. cout << "删除链表失败!" << endl;
  146. return 0;
  147. }</span>

(C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作相关推荐

  1. (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循 ...

  2. 双向循环链表的插入与删除

    关于解释部分不再多说了,网上资料很多,下面就介绍具体的实现吧 //双向循环链表的插入与删除 typedef struct node{     int data;     struct node *pr ...

  3. 【数据结构】链表:带头双向循环链表的增删查改

    本篇要分享的内容是带头双向链表,以下为本片目录 目录 一.链表的所有结构 二.带头双向链表 2.1尾部插入 2.2哨兵位的初始化 2.3头部插入 2.4 打印链表 2.5尾部删除 2.6头部删除 2. ...

  4. 数据结构:带头双向循环链表——增加、删除、查找、修改,详细解析

    读者可以先阅读这一篇:数据结构--单链表的增加.删除.查找.修改,详细解析_昵称就是昵称吧的博客-CSDN博客,可以更好的理解带头双向循环链表. 目录 一.带头双向循环链表的处理和介绍 1.带头双向循 ...

  5. 链表(创建,插入,删除和打印输出

    http://www.bianceng.cn/Programming/C/200705/327.htm  (以下不全,去此网址看) 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了 ...

  6. (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作

    http://blog.csdn.net/fisherwan/article/details/25649073 链表(三)实现双向链表操作,代码如下: [cpp] view plain copy &l ...

  7. c语言用链表对学生成绩排序,学生成绩排序和平均分计算利用c语言链表的创建插入删除.doc...

    #define NULL 0 #define LEN sizeof(struct student) struct student { long num; float score; struct stu ...

  8. C/C++创建和删除文件夹操作(包含多级)

    下面给出创建单个文件夹的方法,每一种方法后面都紧跟着对应的删除文件夹的方法. 此处参考博主. 一:调用Windows API函数 CreateDirectory()和 RemoveDirectory( ...

  9. 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

    1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚,无非就是左小右大 创建二叉搜索树,其实就是多次调用二叉搜索树的插入方法,所以首先我们来讲讲如何插入节点到二叉搜索树里,假设一颗二叉搜索树如下 ...

最新文章

  1. CBWFQ技术简介及应用配置事例
  2. python中的wheel有什么用_什么是Python Wheels?为什么要学Python Wheels
  3. python有向图_Python 中的垃圾回收机制
  4. 软件工程的瀑布, 大泥球, 教堂,集市,和银弹
  5. [云炬创业学笔记]第三章商业创意的发掘与评估测试1
  6. 数据库复习之规范化理论应用(第八次上机内容)
  7. linux平台下Tomcat的安装与优化
  8. linux命令查看g 版本,如何查看linux版本
  9. nltk安装punkt等语料库时报SSL错误完美解决方案及离线安装方法
  10. 鼠标经过超链接文字变色
  11. Zepto自定义模块打包构建
  12. util包的简单介绍
  13. 用Vue.js递归组件构建一个可折叠的树形菜单
  14. 2012年参加油田象棋比赛的几盘棋
  15. Mac安装port(port:command not found解决办法)
  16. 关于SQL Server中将数值类型转换为字符串的问题
  17. python xlsxwriter不覆盖写入_python学习-xlsxwriter模块
  18. 伤害你的,是你对事情的看法
  19. 【java初学】面向对象继承
  20. java微信天气查询接口,全国天气预报信息 API 接口

热门文章

  1. python web开发-flask访问请求数据request
  2. 《你的灯亮着吗?》个人总结
  3. [转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
  4. Method Swizzle黑魔法,修改 ios 系统类库方法(转载)
  5. 辅助的写与数据库交互的XML文件的类
  6. 小试---EF5.0入门实例1
  7. poj2115C Looooops
  8. VS2010 运行库设置
  9. XmlPullParserException
  10. JavaScript: Cookie 详解、实例与应用