Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<typename T>
- struct Link
- {
- T val;
- Link* prev;
- Link* succ;
- Link(const T& value, Link* p = nullptr, Link* s = nullptr)
- :val{value},prev {p}, succ{ s } {}
- Link* add_ordered_(Link*);
- };
- template<typename T >
- Link<T>* Link<T>::add_ordered_(Link<T>*n)
- {
- if (n == nullptr)return this;
- if (this == nullptr)return n;
- if (n->val < this->val)
- {
- Link* temp = this->prev;
- if (temp == nullptr)
- {
- if (this->prev)
- {
- this->prev->succ = n;
- }
- n->prev = this->prev;
- this->prev = n;
- n->succ = this;
- return this;
- }
- while (n->val < temp->val && temp)
- {
- if (temp->prev == nullptr)
- {
- if (temp->prev)
- {
- temp->prev->succ = n;
- }
- n->prev = temp->prev;
- temp->prev = n;
- n->succ = temp;
- return this;
- }
- temp = temp->prev;
- if (n->val > temp->val)
- {
- n->prev = temp;
- if (temp->succ) temp->succ->prev = n;
- n->succ = temp->succ;
- temp->succ = n;
- return this;
- }
- if (temp->prev == nullptr)
- {
- if (temp->prev)
- {
- temp->prev->succ = n;
- }
- n->prev = temp->prev;
- temp->prev = n;
- n->succ = temp;
- return this;
- }
- }
- if (this->prev)
- {
- this->prev->succ = n;
- }
- n->prev = this->prev;
- this->prev = n;
- n->succ = this;
- return this;
- }
- else
- {
- n->prev = this;
- if (this->succ)this->succ->prev = n;
- n->succ = this->succ;
- this->succ = n;
- return n;
- }
- }
- template<typename T>
- void print_link(Link<T>* x)
- {
- while (x)
- {
- cout << x->val << endl;
- x = x->prev;
- }
- }
- int main()
- {
- Link<int>*numbers = new Link<int>{ 5 };
- numbers = numbers->add_ordered_(new Link<int> {7} );
- numbers = numbers->add_ordered_( new Link<int>{3} );
- numbers = numbers->add_ordered_(new Link<int>{ 25 });
- numbers = numbers->add_ordered_(new Link<int>{ 19 });
- numbers = numbers->add_ordered_(new Link<int>{ 22 });
- numbers = numbers->add_ordered_(new Link<int>{ 16 });
- numbers = numbers->add_ordered_(new Link<int>{ 44 });
- numbers = numbers->add_ordered_(new Link<int>{ 11 });
- numbers = numbers->add_ordered_(new Link<int>{ 37 });
- print_link(numbers);
- cout << endl;
- delete[] numbers;
- }
- 44
- 37
- 25
- 22
- 19
- 16
- 11
- 7
- 5
- 3
Add Comment
Please, Sign In to add comment