fork download
  1. #include <iostream>
  2.  
  3. struct Node {
  4. int val;
  5. Node* prev;
  6. Node* next;
  7.  
  8. Node( ) :
  9. val( 0 ),
  10. prev( NULL ),
  11. next( NULL ) {
  12. }
  13. };
  14.  
  15. void swap(Node * n1, Node * n2){
  16. if(n1 == n2)
  17. return;
  18. if(n1 == 0 || n2 == 0){
  19. std::cout << "\nPRIORITYQUEUE ERROR: Trying to swap with non-existent node\n";
  20. return;
  21. }
  22.  
  23. Node * temp = new Node;
  24.  
  25. temp->prev = n1->prev;
  26. temp->next = n1->next;
  27.  
  28. n1->prev = n2->prev;
  29. n1->next = n2->next;
  30.  
  31. n2->prev = temp->prev;
  32. n2->next = temp->next;
  33.  
  34. if(n1->next != 0)
  35. n1->next->prev = n1;
  36. if(n1->prev != 0)
  37. n1->prev->next = n1;
  38. if(n2->next != 0)
  39. n2->next->prev = n2;
  40. if(n2->prev != 0)
  41. n2->prev->next = n2;
  42.  
  43. delete temp;
  44.  
  45. }
  46.  
  47. void print( Node* r ) {
  48. Node* p = r->next;
  49. while( p != NULL ) {
  50. printf( "%d ", p->val );
  51. p = p->next;
  52. }
  53. }
  54.  
  55. Node* end( Node* r ) {
  56. Node* p = r;
  57. while( p->next != NULL ) {
  58. p = p->next;
  59. }
  60. return p;
  61. }
  62.  
  63. void print_reverse( Node* r ) {
  64. Node* p = r;
  65. while( p->prev != NULL ) {
  66. printf( "%d ", p->val );
  67. p = p->prev;
  68. }
  69. }
  70.  
  71. int main() {
  72. Node* r1 = new Node( );
  73. Node* r2 = new Node( );
  74. Node* p1 = r1; Node* p2 = r2;
  75. for( int i = 0; i < 10; ++i ) {
  76. p1->next = new Node( );
  77. p1->next->val = i;
  78. p1->next->prev = p1;
  79. p1 = p1->next;
  80. }
  81. for( int i = 0; i < 10; ++i ) {
  82. p2->next = new Node( );
  83. p2->next->val = 10 - i - 1;
  84. p2->next->prev = p2;
  85. p2 = p2->next;
  86. }
  87.  
  88. printf( "old r1 forward " );
  89. print( r1 );
  90. printf( "\n" );
  91.  
  92. printf( "old r1 backword " );
  93. print_reverse( end( r1 ) );
  94. printf( "\n" );
  95.  
  96. printf( "old r2 forward " );
  97. print( r2 );
  98. printf( "\n" );
  99.  
  100. printf( "old r2 backword " );
  101. print_reverse( end( r2 ) );
  102. printf( "\n" );
  103.  
  104. p1 = r1;
  105. while( p1->val != 3 ) { p1 = p1->next; }
  106.  
  107. p2 = r2;
  108. while( p2->val != 7 ) { p2 = p2->next; }
  109.  
  110. swap( p1, p2 );
  111.  
  112. printf( "new r1 forward " );
  113. print( r1 );
  114. printf( "\n" );
  115.  
  116. printf( "new r1 backword " );
  117. print_reverse( end( r1 ) );
  118. printf( "\n" );
  119.  
  120. printf( "new r2 forward " );
  121. print( r2 );
  122. printf( "\n" );
  123.  
  124. printf( "new r2 backword " );
  125. print_reverse( end( r2 ) );
  126. printf( "\n" );
  127.  
  128. return 0;
  129. }
Success #stdin #stdout 0s 2860KB
stdin
Standard input is empty
stdout
old r1  forward 0 1 2 3 4 5 6 7 8 9 
old r1 backword 9 8 7 6 5 4 3 2 1 0 
old r2  forward 9 8 7 6 5 4 3 2 1 0 
old r2 backword 0 1 2 3 4 5 6 7 8 9 
new r1  forward 0 1 2 7 4 5 6 7 8 9 
new r1 backword 9 8 7 6 5 4 7 2 1 0 
new r2  forward 9 8 3 6 5 4 3 2 1 0 
new r2 backword 0 1 2 3 4 5 6 3 8 9