tolord

Untitled

Dec 11th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <ctime>
  4. #include <windows.h>
  5.  
  6. using namespace std;
  7.  
  8. class simple_list {
  9.     struct element {
  10.         int data;
  11.         element* next;
  12.         element* prev;
  13.         element(int _data, element* _next, element* _prev) : data(_data), next(_next), prev(_prev) {}
  14.     };
  15.  
  16.     element* head;
  17.     element* tail;
  18.     int num;
  19.  
  20.  
  21.  
  22.     void swap(element* first, element* second) {
  23.         if (first == nullptr || second == nullptr) return;
  24.         if (first == tail || second == head) swap(first, second);
  25.  
  26.         bool neighbours = first->next == second;
  27.         element* fPrev = first->prev;
  28.         element* sNext = second->next;
  29.         if (!neighbours) {
  30.             element* fNext = first->next;
  31.             element* sPrev = second->prev;
  32.  
  33.             fNext->prev = second;
  34.             second->next = fNext;
  35.  
  36.             sPrev->next = first;
  37.             first->prev = sPrev;
  38.         }
  39.  
  40.         if (fPrev != nullptr) {
  41.             fPrev->next = second;
  42.         } else {
  43.             head = second;
  44.         }
  45.         second->prev = fPrev;
  46.  
  47.         if (sNext != nullptr) {
  48.             sNext->prev = first;
  49.         } else {
  50.             tail = first;
  51.         }
  52.         first->next = sNext;
  53.  
  54.         if (neighbours) {
  55.             first->prev = second;
  56.             second->next = first;
  57.         }
  58.     }
  59.  
  60. public:
  61.  
  62.     class list_iterator {
  63.         element* data;
  64.     public:
  65.         list_iterator(element* _data) : data(_data) {}
  66.  
  67.         bool operator== (const list_iterator right) {
  68.             return data == right.data;
  69.         }
  70.  
  71.         bool operator != (const list_iterator right) {
  72.             return !(*this == right);
  73.         }
  74.  
  75.         list_iterator operator++ (int unused) {
  76.             if (data == nullptr) {
  77.                 throw new exception();
  78.             }
  79.             element* temp = data;
  80.             data = data->next;
  81.             return *(new list_iterator(temp));
  82.         }
  83.  
  84.         int operator* () {
  85.             if (data == nullptr) throw new exception();
  86.             return data->data;
  87.         }
  88.     };
  89.  
  90.     simple_list() {
  91.         head = nullptr;
  92.         tail = nullptr;
  93.         num = 0;
  94.     }
  95.  
  96.     simple_list(vector<int> arr) : simple_list() {
  97.         for (int i = 0; i < arr.size(); i ++) {
  98.             push_back(arr[i]);
  99.         }
  100.     }
  101.  
  102.     void push_back(int n) {
  103.         if (num != 0) {
  104.             tail->next = new element(n, nullptr, tail);
  105.             tail = tail->next;
  106.         } else {
  107.             head = new element(n, nullptr, nullptr);
  108.             tail = head;
  109.         }
  110.         num ++;
  111.     }
  112.  
  113.     list_iterator begin() {
  114.         return list_iterator(head);
  115.     }
  116.  
  117.     list_iterator end() {
  118.         return list_iterator(nullptr);
  119.     }
  120.  
  121.     void swap(int i, int j) {
  122.         if (i < 0 || j < 0 || i >= num || j >= num) return;
  123.         if (i > j) swap(i, j);
  124.  
  125.         element* elI = head;
  126.         element* elJ = nullptr;
  127.         for (int k = 0; k < i; k ++) {
  128.             elI = elI->next;
  129.         }
  130.  
  131.         elJ = elI;
  132.         for (int k = i; k < j; k ++) {
  133.             elJ = elJ->next;
  134.         }
  135.         swap(elI, elJ);
  136.     }
  137.  
  138.     void print() {
  139.         cout << endl;
  140.         element* temp = head;
  141.         while(temp != nullptr) {
  142.             cout << temp->data << ' ';
  143.             temp = temp->next;
  144.         }
  145.     }
  146.  
  147.     void sort() {
  148.         if (num <= 1) return;
  149.         for (int i = num; i > 0; i --) {
  150.             element* tempL = head;
  151.             for (int j = 1; j < i; j ++) {
  152.                 if (tempL->data > tempL->next->data) {
  153.                     swap(tempL, tempL->next);
  154.                 } else {
  155.                     tempL = tempL->next;
  156.                 }
  157.             }
  158.         }
  159.     }
  160.  
  161.     int size() {
  162.         return num;
  163.     }
  164. };
  165.  
  166. int main()
  167.  
  168. {
  169.     srand(time(0));
  170.     vector<int> kek;
  171.     for (int i = 11; i > 0; i --) {
  172.         kek.push_back(rand() % 50);
  173.     }
  174.  
  175.     simple_list lol(kek);
  176.  
  177.     lol.print();
  178.     lol.sort();
  179.     lol.print();
  180.     cout << endl;
  181.     for (auto a = lol.begin(); a != lol.end(); a ++) {
  182.         cout << *a << ' ';
  183.     }
  184.  
  185.     return 0;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment