当前位置:   article > 正文

C++双向链表(插入/删除/打印)_c++请构造一个双向链表,实现链表插入和删除的代码

c++请构造一个双向链表,实现链表插入和删除的代码

1.引入 + 建立结构体        

        双向链表基于单向链表,由只能指向next或者previous节点变为可以同时知道前后两个节点的存在。

双向链表

因此可以同时创建两个指针,指向头部的head和指向尾部的tail去帮助后边的遍历。

  1. struct Node {
  2. int data;
  3. Node* next;
  4. Node* prev;
  5. };
  6. Node* head = NULL;
  7. Node* tail = NULL;

2.实现头插和尾插

  1. Node* CreateNode(int n) {//创建首尾指向空的节点
  2. Node* tmp = new Node();
  3. tmp->data = n;
  4. tmp->next = NULL;
  5. tmp->prev = NULL;
  6. return tmp;
  7. }
  8. void InsertHead(int x) {
  9. Node* temp = CreateNode(x);
  10. if (head == NULL) {
  11. head = temp;
  12. tail = temp;
  13. }
  14. temp->next = head;
  15. head->prev = temp;
  16. head = temp;
  17. }
  18. void InsertTail(int y) {
  19. Node* temp = CreateNode(y);
  20. if (tail == NULL) {
  21. head = temp;
  22. tail = temp;
  23. }
  24. tail->next = temp;
  25. temp->prev = tail;
  26. tail = temp;
  27. }

3.正向和反向打印链表

  1. void Print() {
  2. Node* p = head;
  3. while (p != NULL) {
  4. cout << p->data;
  5. p = p->next;
  6. }
  7. cout << endl;
  8. }
  9. void ReversePrint() {
  10. Node* q = tail;
  11. while (q != NULL) {
  12. cout << q->data;
  13. q = q->prev;
  14. }
  15. cout << endl;
  16. }

4.删除链表中的节点

  1. //假设删除目标为x。
  2. //将x-1的尾部指针指向x+1;将x+1的头部指针指向x-1。
  3. //最后将x delete。
  4. void ChangePtr(Node* ptr) {
  5. if (ptr->prev != NULL) {
  6. ptr->prev->next = ptr->next;
  7. }
  8. else {
  9. head = ptr->next;
  10. }
  11. if (ptr->next != NULL) {
  12. ptr->next->prev = ptr->prev;
  13. }
  14. else {
  15. tail = ptr->prev;
  16. }
  17. }
  18. void Delete(int x) {
  19. Node* tmp = head;
  20. Node* tmp1 = tail;
  21. //搜索用了两个指针,为了快一点
  22. while (tmp != NULL && tmp1 != NULL) {
  23. if (tmp->data == x) {
  24. ChangePtr(tmp);
  25. delete(tmp);//记得new用delete!!不是free!
  26. return;
  27. }
  28. else if (tmp1->data == x) {
  29. ChangePtr(tmp1);
  30. delete(tmp1);
  31. return;
  32. }
  33. tmp = tmp->next;
  34. tmp1 = tmp1->prev;
  35. }
  36. }

5.整体代码

  1. /*
  2. *******************************************
  3. *
  4. * 项目:双向链表/ Double Linked List
  5. * 结构体--Node(拥有prev,next两个指针)
  6. * 全局变量:
  7. * head:指向头部
  8. * tail:指向尾部
  9. *
  10. *******************************************
  11. *
  12. * CreateNode():创建一个首位地址=0的节点
  13. * InsertHead():头部插入节点
  14. * InsertTail():尾部插入节点
  15. *
  16. *******************************************
  17. *
  18. * Delete():删除节点(传入要删除的data)
  19. * -ChangePtr():将目标节点(要删的那个)的前后节点建立联结
  20. *
  21. *******************************************
  22. *
  23. * Print():打印链表(正向)
  24. * ReversePrint():打印链表(反向)
  25. *
  26. *******************************************
  27. */
  28. #include <iostream>
  29. using namespace std;
  30. struct Node {
  31. int data;
  32. Node* next;
  33. Node* prev;
  34. };
  35. Node* head = NULL;
  36. Node* tail = NULL;
  37. Node* CreateNode(int n) {
  38. Node* tmp = new Node();
  39. tmp->data = n;
  40. tmp->next = NULL;
  41. tmp->prev = NULL;
  42. return tmp;
  43. }
  44. void InsertHead(int x) {
  45. Node* temp = CreateNode(x);
  46. if (head == NULL) {
  47. head = temp;
  48. tail = temp;
  49. }
  50. temp->next = head;
  51. head->prev = temp;
  52. head = temp;
  53. }
  54. void InsertTail(int y) {
  55. Node* temp = CreateNode(y);
  56. if (tail == NULL) {
  57. head = temp;
  58. tail = temp;
  59. }
  60. tail->next = temp;
  61. temp->prev = tail;
  62. tail = temp;
  63. }
  64. void ChangePtr(Node* ptr) {
  65. if (ptr->prev != NULL) {
  66. ptr->prev->next = ptr->next;
  67. }
  68. else {
  69. head = ptr->next;
  70. }
  71. if (ptr->next != NULL) {
  72. ptr->next->prev = ptr->prev;
  73. }
  74. else {
  75. tail = ptr->prev;
  76. }
  77. }
  78. void Delete(int x) {
  79. Node* tmp = head;
  80. Node* tmp1 = tail;
  81. while (tmp != NULL && tmp1 != NULL) {
  82. if (tmp->data == x) {
  83. ChangePtr(tmp);
  84. delete(tmp);//记得new用delete!!
  85. return;
  86. }
  87. else if (tmp1->data == x) {
  88. ChangePtr(tmp1);
  89. delete(tmp1);
  90. return;
  91. }
  92. tmp = tmp->next;
  93. tmp1 = tmp1->prev;
  94. }
  95. }
  96. void Print() {
  97. Node* p = head;
  98. while (p != NULL) {
  99. cout << p->data;
  100. p = p->next;
  101. }
  102. cout << endl;
  103. }
  104. void ReversePrint() {
  105. Node* q = tail;
  106. while (q != NULL) {
  107. cout << q->data;
  108. q = q->prev;
  109. }
  110. cout << endl;
  111. }
  112. int main()
  113. {
  114. InsertHead(2);
  115. InsertTail(4);
  116. InsertHead(6);
  117. InsertTail(8);
  118. InsertTail(3);
  119. Print();
  120. ReversePrint();
  121. Delete(8);
  122. Print();
  123. ReversePrint();
  124. }

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

闽ICP备14008679号