【数据结构】双向链表的插入和删除操作

亦凉 2021-12-03 11:34 393阅读 0赞
  1. #include<iostream>
  2. using namespace std;
  3. typedef struct DNode {
  4. int data;
  5. struct DNode *prior;
  6. struct DNode *next;
  7. }DNode, *DLinkList;
  8. bool InitDList(DLinkList &DL) {
  9. DL = new DNode;
  10. DL->prior = NULL;
  11. DL->next = NULL;
  12. DL->data = 0;
  13. if (DL)
  14. return true;
  15. return false;
  16. }
  17. void CreateDList(DLinkList &DL) {
  18. DNode *p, *r = DL;
  19. for (int i=0; i<10; i++, DL->data++) {
  20. p = new DNode;
  21. p->data = i;
  22. r->next = p;
  23. p->prior = r;
  24. p->next = NULL;
  25. r = p;
  26. }
  27. r->next = NULL;
  28. }
  29. void PrintDList(DLinkList DL) {
  30. cout<<"Head Node = "<<DL<<endl;
  31. DNode *p = DL->next;
  32. int i = 1;
  33. while (p) {
  34. cout<<"p" <<i<< "= "<<p<<" p->data = "<<p->data<<" p->prior = "<<p->prior<<" p->next = "<<p->next<<endl;
  35. p = p->next;
  36. i++;
  37. }
  38. cout<<endl;
  39. }
  40. // 删除第pos个节点
  41. void DeleteElem(DLinkList &DL, int pos) {
  42. if (pos < 0 || pos > DL->data) {
  43. cout<<"Invalid Position!"<<endl;
  44. return;
  45. }
  46. DNode *p = DL->next;
  47. for (int i=0; i<pos-1; i++) {
  48. p=p->next;
  49. }
  50. p->prior->next = p->next;
  51. p->next->prior = p->prior;
  52. delete p;
  53. DL->data--;
  54. }
  55. // 插入节点到第pos个位置
  56. void InsertElem(DLinkList &DL, int pos, int data) {
  57. if (pos < 0 || pos > DL->data) {
  58. cout<<"Invalid Position!"<<endl;
  59. return;
  60. }
  61. DNode *p = DL->next, *newNode;
  62. newNode = new DNode;
  63. newNode->data = data;
  64. for (int i=1; i<pos-1; i++) {
  65. p=p->next;
  66. }
  67. newNode->next = p->next;
  68. p->next->prior = newNode;
  69. p->next = newNode;
  70. newNode->prior = p;
  71. DL->data++;
  72. }
  73. int main() {
  74. DLinkList DL;
  75. InitDList(DL);
  76. CreateDList(DL);
  77. PrintDList(DL);
  78. cout<<"删除第5个节点"<<endl;
  79. DeleteElem(DL, 5);
  80. PrintDList(DL);
  81. cout<<"将19插入到第7个节点的位置"<<endl;
  82. InsertElem(DL, 7, 19);
  83. PrintDList(DL);
  84. return 0;
  85. }
  86. // 测试结果
  87. Head Node = 0x757fc0
  88. p1= 0x757f28 p->data = 0 p->prior = 0x757fc0 p->next = 0x757f40
  89. p2= 0x757f40 p->data = 1 p->prior = 0x757f28 p->next = 0x757f58
  90. p3= 0x757f58 p->data = 2 p->prior = 0x757f40 p->next = 0x757ae0
  91. p4= 0x757ae0 p->data = 3 p->prior = 0x757f58 p->next = 0x757af8
  92. p5= 0x757af8 p->data = 4 p->prior = 0x757ae0 p->next = 0x757b10
  93. p6= 0x757b10 p->data = 5 p->prior = 0x757af8 p->next = 0x757b28
  94. p7= 0x757b28 p->data = 6 p->prior = 0x757b10 p->next = 0x757b40
  95. p8= 0x757b40 p->data = 7 p->prior = 0x757b28 p->next = 0x757b58
  96. p9= 0x757b58 p->data = 8 p->prior = 0x757b40 p->next = 0x757b70
  97. p10= 0x757b70 p->data = 9 p->prior = 0x757b58 p->next = 0
  98. 删除第5个节点
  99. Head Node = 0x757fc0
  100. p1= 0x757f28 p->data = 0 p->prior = 0x757fc0 p->next = 0x757f40
  101. p2= 0x757f40 p->data = 1 p->prior = 0x757f28 p->next = 0x757f58
  102. p3= 0x757f58 p->data = 2 p->prior = 0x757f40 p->next = 0x757ae0
  103. p4= 0x757ae0 p->data = 3 p->prior = 0x757f58 p->next = 0x757b10
  104. p5= 0x757b10 p->data = 5 p->prior = 0x757ae0 p->next = 0x757b28
  105. p6= 0x757b28 p->data = 6 p->prior = 0x757b10 p->next = 0x757b40
  106. p7= 0x757b40 p->data = 7 p->prior = 0x757b28 p->next = 0x757b58
  107. p8= 0x757b58 p->data = 8 p->prior = 0x757b40 p->next = 0x757b70
  108. p9= 0x757b70 p->data = 9 p->prior = 0x757b58 p->next = 0
  109. 19插入到第7个节点的位置
  110. Head Node = 0x757fc0
  111. p1= 0x757f28 p->data = 0 p->prior = 0x757fc0 p->next = 0x757f40
  112. p2= 0x757f40 p->data = 1 p->prior = 0x757f28 p->next = 0x757f58
  113. p3= 0x757f58 p->data = 2 p->prior = 0x757f40 p->next = 0x757ae0
  114. p4= 0x757ae0 p->data = 3 p->prior = 0x757f58 p->next = 0x757b10
  115. p5= 0x757b10 p->data = 5 p->prior = 0x757ae0 p->next = 0x757b28
  116. p6= 0x757b28 p->data = 6 p->prior = 0x757b10 p->next = 0x757af8
  117. p7= 0x757af8 p->data = 19 p->prior = 0x757b28 p->next = 0x757b40
  118. p8= 0x757b40 p->data = 7 p->prior = 0x757af8 p->next = 0x757b58
  119. p9= 0x757b58 p->data = 8 p->prior = 0x757b40 p->next = 0x757b70
  120. p10= 0x757b70 p->data = 9 p->prior = 0x757b58 p->next = 0

发表评论

表情:
评论列表 (有 0 条评论,393人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构--双向

    数据结构-链表-双向链表 单向链表和环形链表都是属于拥有方向性的链表,只能单向遍历,如果由于某种原因造成了某个连接断裂,那后面的链表数据便会遗失而无法复原。所以,我们可以