当前位置:   article > 正文

使用C++实现双链表_c++双向链表

c++双向链表

使用C++实现双链表


一、什么是双链表?

由下图就是一个双链表节点以及c++定义双链表节点!

                        

  1. typedef struct DNode {//定义双链表节点结构体
  2. DNode* pre;//前驱指针
  3. int data;//数据域
  4. DNode* next;//后继指针
  5. }DNode,*LinkList;//定义双链表节点和双链表

提示:以下是本篇文章正文内容,下面案例可供参考

二、双链表的初始化

  1. //1.初始化双链表节点
  2. bool InitList(LinkList& L) {
  3. L = new DNode;
  4. if (!L) {
  5. cout << "申请节点失败!" << endl;
  6. return false;
  7. }
  8. else {
  9. L->next = NULL;//初始化后继指针
  10. L->pre = NULL;//初始化前驱指针
  11. //cout << "申请节点成功!" << endl;
  12. return true;
  13. }
  14. }

三、打印双链表

  1. //2.打印双链表
  2. bool PrintList(LinkList& L) {
  3. if (L->next == NULL) {
  4. cout << "该双链表不存在!" << endl;
  5. return false; }//判断是否是空链表
  6. DNode* p = L->next;
  7. while (p)
  8. {
  9. cout << p->data << " ";//打印数据
  10. p = p->next;//向后移动指针
  11. }
  12. cout << endl;
  13. return true;
  14. }

四、获取有效长度

  1. //3.获取有效长度
  2. int Length(LinkList& L) {
  3. DNode* p = L->next;//申请一个新节点
  4. int lenth = 0;//该变量用来保存长度
  5. while (p) {//p不为空时执行
  6. lenth++;//长度加1
  7. p = p->next;//节点向后移动
  8. }
  9. cout << endl;//只是为了换行
  10. return lenth;
  11. }

五、使用头插法创建双链表

  1. bool ListHeadInsert(LinkList& L) {
  2. int x;
  3. cout << "请输入元素的个数:" ;
  4. cin >> x;
  5. if (x <= 0) {
  6. cout << "您输入的值无意义!" << endl;
  7. return false;
  8. }
  9. cout << "请依次输入元素的值!"<<endl;
  10. while (x) {
  11. DNode* p = new DNode;//申请一个新节点
  12. cin >> p->data;//为新节点输入数据
  13. p->next = L->next;//将头节点的后继指针赋给新节点
  14. p->pre = L;//再让新节点的前驱指针指向头节点
  15. L->next = p;//移动头节点
  16. x--;//判断循环条件
  17. }
  18. cout << "采用头插法成功创建的双链表结果为:";
  19. PrintList(L);//打印双链表
  20. return true;
  21. }

六、使用尾插法创建双链表

  1. bool TailInsert(LinkList& L) {
  2. DNode* p = new DNode;//申请一个节点
  3. InitList(p);//初始化新节点
  4. L= p;//让新节点赋给头节点
  5. int x;
  6. cout << "请输入元素的个数:";
  7. cin >> x;
  8. if (x <= 0) {
  9. cout << "您输入的值无意义!" << endl;
  10. return false;
  11. }
  12. cout << "请依次输入元素的值!" << endl;
  13. while (x) {
  14. DNode* r = new DNode;//再申请一个新节点
  15. InitList(r);//初始化这个新节点
  16. cin >> r->data;//为这个新节点添加数据
  17. p->next = r;//让头节点之后的第一个节点指向这个新节点
  18. r->pre = p;//让新节点的前驱指针指向头节点
  19. p = p->next;//让头节点向后移动,目的是为了连接所有的节点
  20. x--;//判断循环并退出
  21. }
  22. cout << "采用尾插法成功创建的双链表结果为:";
  23. PrintList(L);//打印双链表
  24. return true;
  25. }

七、按值查找双链表

  1. bool GetValueElem(LinkList& L) {
  2. DNode* p = L->next;
  3. int x;
  4. cout << "请输入你要查找的值!" << endl;
  5. cin >> x;
  6. while (p) {
  7. if (p->data == x) {
  8. cout << "您要查找的值"<<x<<"存在!" << endl;
  9. return true;
  10. }
  11. p = p->next;
  12. }
  13. cout << "抱歉!您要查找的值"<<x<<"不存在!" << endl;
  14. return false;
  15. }

八、按位查找双链表

  1. bool GetBitElem(LinkList& L) {
  2. DNode* p = L->next;
  3. int x;
  4. cout << "请输入你要查找的位:";
  5. cin >> x;
  6. int t = Length(L);
  7. if (x<1 || x>t) {
  8. cout << "你要查的位不存在或无意义!" << endl;
  9. return false;
  10. }
  11. else {
  12. while (p)
  13. {
  14. x--;
  15. p = p->next;
  16. if (x == 1) {
  17. cout << "按位查找成功!且该数据为:" << p->data << endl;
  18. return true;
  19. }
  20. }
  21. }
  22. }

九、在双链表中插入数据

  1. bool Insert(LinkList& L) {
  2. int x;
  3. cout << "请输入你要插入的位数!" << endl;
  4. cin >> x;
  5. if (x<1 || x>Length(L)) {
  6. cout << "你要插入的位数不存在或无意义!" << endl;
  7. return false;
  8. }
  9. int Value;
  10. cout << "请输入你要插入的值:" ;
  11. cin >> Value;
  12. DNode* p = L;
  13. DNode* r;
  14. InitList(r);
  15. while (x) {
  16. if (x == 1) {//成功找到了要插入的节点的前一个节点
  17. r->data = Value;//将数据保存到新节点中
  18. r->next = p->next;//让新节点指向第一个节点
  19. p->next->pre = r;//让第二个节点的前驱指针指向新节点
  20. r->pre = p;//让新节点的前驱指针指向第一个节点
  21. p->next = r;//让第一个节点的后继指针指向新节点
  22. cout << "添加成功后的双链表是";
  23. PrintList(L);//打印单链表
  24. }
  25. else p = p->next;//没有找到想要插入的节点,向后移动节点
  26. x--;
  27. }
  28. return false;
  29. }

十、删除节点

  1. bool Delete(LinkList& L) {
  2. int x;
  3. cout << "请输入你要删除的节点;";
  4. cin >> x;
  5. if (x<1 || x>Length(L)) {
  6. cout << "您想删除的节点不存在或无意义!" << endl;
  7. return false;
  8. }
  9. else {
  10. DNode* p = L;
  11. DNode* r;
  12. InitList(r);
  13. while (x)
  14. {
  15. if (x == 1) {
  16. r->next = p->next;//新节点指向要删除的节点
  17. p->next->pre = r;//让要删除节点的前驱指针指向新节点
  18. p->next = r->next->next;//让被删除节点的前一个指向要删除的后一个节点
  19. free(r);
  20. cout << "删除成功!" << endl;
  21. cout << "删除后的双链表是" ;
  22. PrintList(L);//打印单链表
  23. return true;
  24. }
  25. p = p->next;//没有找到想要插入的节点,向后移动节点
  26. x--;
  27. }
  28. return false;
  29. }
  30. }


完整代码

以下代码运行在Visual Studio2019编译器下运行成功!

  1. #include<iostream>
  2. #include <stdio.h>
  3. #include <string>
  4. using namespace std;
  5. typedef struct DNode {//定义双链表节点结构体
  6. DNode* pre;//前驱指针
  7. int data;//数据域
  8. DNode* next;//后继指针
  9. }DNode,*LinkList;//定义双链表节点和双链表
  10. //1.初始化双链表节点
  11. bool InitList(LinkList& L) {
  12. L = new DNode;
  13. if (!L) {
  14. cout << "申请节点失败!" << endl;
  15. return false;
  16. }
  17. else {
  18. L->next = NULL;//初始化后继指针
  19. L->pre = NULL;//初始化前驱指针
  20. //cout << "申请节点成功!" << endl;
  21. return true;
  22. }
  23. }
  24. //2.打印双链表
  25. bool PrintList(LinkList& L) {
  26. if (L->next == NULL) {
  27. cout << "该双链表不存在!" << endl;
  28. return false; }//判断是否是空链表
  29. DNode* p = L->next;
  30. while (p)
  31. {
  32. cout << p->data << " ";//打印数据
  33. p = p->next;//向后移动指针
  34. }
  35. cout << endl;
  36. return true;
  37. }
  38. //3.获取有效长度
  39. int Length(LinkList& L) {
  40. DNode* p = L->next;//申请一个新节点
  41. int lenth = 0;//该变量用来保存长度
  42. while (p) {//p不为空时执行
  43. lenth++;//长度加1
  44. p = p->next;//节点向后移动
  45. }
  46. cout << endl;//只是为了换行
  47. return lenth;
  48. }
  49. //4.创建双链表
  50. //(1)采用头插入法
  51. bool ListHeadInsert(LinkList& L) {
  52. int x;
  53. cout << "请输入元素的个数:" ;
  54. cin >> x;
  55. if (x <= 0) {
  56. cout << "您输入的值无意义!" << endl;
  57. return false;
  58. }
  59. cout << "请依次输入元素的值!"<<endl;
  60. while (x) {
  61. DNode* p = new DNode;//申请一个新节点
  62. cin >> p->data;//为新节点输入数据
  63. p->next = L->next;//将头节点的后继指针赋给新节点
  64. p->pre = L;//再让新节点的前驱指针指向头节点
  65. L->next = p;//移动头节点
  66. x--;//判断循环条件
  67. }
  68. cout << "采用头插法成功创建的双链表结果为:";
  69. PrintList(L);//打印双链表
  70. return true;
  71. }
  72. //(2)尾插入法
  73. bool TailInsert(LinkList& L) {
  74. DNode* p = new DNode;//申请一个节点
  75. InitList(p);//初始化新节点
  76. L= p;//让新节点赋给头节点
  77. int x;
  78. cout << "请输入元素的个数:";
  79. cin >> x;
  80. if (x <= 0) {
  81. cout << "您输入的值无意义!" << endl;
  82. return false;
  83. }
  84. cout << "请依次输入元素的值!" << endl;
  85. while (x) {
  86. DNode* r = new DNode;//再申请一个新节点
  87. InitList(r);//初始化这个新节点
  88. cin >> r->data;//为这个新节点添加数据
  89. p->next = r;//让头节点之后的第一个节点指向这个新节点
  90. r->pre = p;//让新节点的前驱指针指向头节点
  91. p = p->next;//让头节点向后移动,目的是为了连接所有的节点
  92. x--;//判断循环并退出
  93. }
  94. cout << "采用尾插法成功创建的双链表结果为:";
  95. PrintList(L);//打印双链表
  96. return true;
  97. }
  98. // 5.查找双链表
  99. //(1)按值查找
  100. bool GetValueElem(LinkList& L) {
  101. DNode* p = L->next;
  102. int x;
  103. cout << "请输入你要查找的值!" << endl;
  104. cin >> x;
  105. while (p) {
  106. if (p->data == x) {
  107. cout << "您要查找的值"<<x<<"存在!" << endl;
  108. return true;
  109. }
  110. p = p->next;
  111. }
  112. cout << "抱歉!您要查找的值"<<x<<"不存在!" << endl;
  113. return false;
  114. }
  115. //(2)按位查找
  116. bool GetBitElem(LinkList& L) {
  117. DNode* p = L->next;
  118. int x;
  119. cout << "请输入你要查找的位:";
  120. cin >> x;
  121. int t = Length(L);
  122. if (x<1 || x>t) {
  123. cout << "你要查的位不存在或无意义!" << endl;
  124. return false;
  125. }
  126. else {
  127. while (p)
  128. {
  129. x--;
  130. p = p->next;
  131. if (x == 1) {
  132. cout << "按位查找成功!且该数据为:" << p->data << endl;
  133. return true;
  134. }
  135. }
  136. }
  137. }
  138. bool Insert(LinkList& L) {
  139. int x;
  140. cout << "请输入你要插入的位数!" << endl;
  141. cin >> x;
  142. if (x<1 || x>Length(L)) {
  143. cout << "你要插入的位数不存在或无意义!" << endl;
  144. return false;
  145. }
  146. int Value;
  147. cout << "请输入你要插入的值:" ;
  148. cin >> Value;
  149. DNode* p = L;
  150. DNode* r;
  151. InitList(r);
  152. while (x) {
  153. if (x == 1) {//成功找到了要插入的节点的前一个节点
  154. r->data = Value;//将数据保存到新节点中
  155. r->next = p->next;//让新节点指向第一个节点
  156. p->next->pre = r;//让第二个节点的前驱指针指向新节点
  157. r->pre = p;//让新节点的前驱指针指向第一个节点
  158. p->next = r;//让第一个节点的后继指针指向新节点
  159. cout << "添加成功后的双链表是";
  160. PrintList(L);//打印单链表
  161. }
  162. else p = p->next;//没有找到想要插入的节点,向后移动节点
  163. x--;
  164. }
  165. return false;
  166. }
  167. //7.删除节点
  168. bool Delete(LinkList& L) {
  169. int x;
  170. cout << "请输入你要删除的节点;";
  171. cin >> x;
  172. if (x<1 || x>Length(L)) {
  173. cout << "您想删除的节点不存在或无意义!" << endl;
  174. return false;
  175. }
  176. else {
  177. DNode* p = L;
  178. DNode* r;
  179. InitList(r);
  180. while (x)
  181. {
  182. if (x == 1) {
  183. r->next = p->next;//新节点指向要删除的节点
  184. p->next->pre = r;//让要删除节点的前驱指针指向新节点
  185. p->next = r->next->next;//让被删除节点的前一个指向要删除的后一个节点
  186. free(r);
  187. cout << "删除成功!" << endl;
  188. cout << "删除后的双链表是" ;
  189. PrintList(L);//打印单链表
  190. return true;
  191. }
  192. p = p->next;//没有找到想要插入的节点,向后移动节点
  193. x--;
  194. }
  195. return false;
  196. }
  197. }
  198. int main(){
  199. LinkList L;//定义一个双链表L
  200. InitList(L);//为链表L初始化
  201. ListHeadInsert(L);//使用头插法创建双链表
  202. TailInsert(L);//使用尾插法创建双链表
  203. GetValueElem(L);//按值查找
  204. GetBitElem(L); //按位查找
  205. Insert(L); //插入数据
  206. Delete(L); //删除数据
  207. }

代码运行截图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/427431
推荐阅读
相关标签
  

闽ICP备14008679号