Guest User

Untitled

a guest
Mar 21st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.76 KB | None | 0 0
  1. template<typename T>
  2. struct Link
  3. {
  4. T val;
  5. Link* prev;
  6. Link* succ;
  7.  
  8. Link(const T& value, Link* p = nullptr, Link* s = nullptr)
  9. :val{value},prev {p}, succ{ s } {}
  10.  
  11. Link* add_ordered_(Link*);
  12. };
  13.  
  14. template<typename T >
  15. Link<T>* Link<T>::add_ordered_(Link<T>*n)
  16. {
  17. if (n == nullptr)return this;
  18. if (this == nullptr)return n;
  19.  
  20. if (n->val < this->val)
  21. {
  22. Link* temp = this->prev;
  23. if (temp == nullptr)
  24. {
  25. if (this->prev)
  26. {
  27. this->prev->succ = n;
  28. }
  29. n->prev = this->prev;
  30. this->prev = n;
  31. n->succ = this;
  32. return this;
  33. }
  34. while (n->val < temp->val && temp)
  35. {
  36. if (temp->prev == nullptr)
  37. {
  38. if (temp->prev)
  39. {
  40. temp->prev->succ = n;
  41. }
  42. n->prev = temp->prev;
  43. temp->prev = n;
  44. n->succ = temp;
  45. return this;
  46. }
  47. temp = temp->prev;
  48. if (n->val > temp->val)
  49. {
  50. n->prev = temp;
  51. if (temp->succ) temp->succ->prev = n;
  52. n->succ = temp->succ;
  53. temp->succ = n;
  54. return this;
  55. }
  56. if (temp->prev == nullptr)
  57. {
  58. if (temp->prev)
  59. {
  60. temp->prev->succ = n;
  61. }
  62. n->prev = temp->prev;
  63. temp->prev = n;
  64. n->succ = temp;
  65. return this;
  66. }
  67. }
  68.  
  69. if (this->prev)
  70. {
  71. this->prev->succ = n;
  72. }
  73. n->prev = this->prev;
  74. this->prev = n;
  75. n->succ = this;
  76. return this;
  77. }
  78. else
  79. {
  80. n->prev = this;
  81. if (this->succ)this->succ->prev = n;
  82. n->succ = this->succ;
  83. this->succ = n;
  84. return n;
  85. }
  86. }
  87.  
  88. template<typename T>
  89. void print_link(Link<T>* x)
  90. {
  91. while (x)
  92. {
  93. cout << x->val << endl;
  94. x = x->prev;
  95. }
  96. }
  97.  
  98. int main()
  99. {
  100. Link<int>*numbers = new Link<int>{ 5 };
  101. numbers = numbers->add_ordered_(new Link<int> {7} );
  102. numbers = numbers->add_ordered_( new Link<int>{3} );
  103. numbers = numbers->add_ordered_(new Link<int>{ 25 });
  104. numbers = numbers->add_ordered_(new Link<int>{ 19 });
  105. numbers = numbers->add_ordered_(new Link<int>{ 22 });
  106. numbers = numbers->add_ordered_(new Link<int>{ 16 });
  107. numbers = numbers->add_ordered_(new Link<int>{ 44 });
  108. numbers = numbers->add_ordered_(new Link<int>{ 11 });
  109. numbers = numbers->add_ordered_(new Link<int>{ 37 });
  110. print_link(numbers);
  111. cout << endl;
  112. delete[] numbers;
  113. }
  114.  
  115. 44
  116. 37
  117. 25
  118. 22
  119. 19
  120. 16
  121. 11
  122. 7
  123. 5
  124. 3
Add Comment
Please, Sign In to add comment