Advertisement
sashachca

Untitled

Nov 3rd, 2017
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.58 KB | None | 0 0
  1. //
  2. //  samost 2.cpp
  3. //  Zadach C++
  4. //
  5. //  Created by Хмелев Саша on 30/05/2017.
  6. //  Copyright © 2017 Хмелев Саша. All rights reserved.
  7. //
  8. /* Необходимо реализовать шаблон списка L, который содержит объекты произвольного типа. Список должен обладать возможностями добавления (только в начало), удаления (только с конца) и быстрой сортировки */
  9.  
  10. #include <iostream>
  11. using namespace std;
  12.  
  13. template <class T>
  14. class List {
  15.    
  16.     class Element {
  17.     public:
  18.         Element *front, *cur, *next;
  19.         T value;
  20.     };
  21.    
  22. protected:
  23.     Element* front;
  24.     Element* next;
  25. public:
  26.     size_t size;
  27.     T* arr;
  28.     // конструктор
  29.     List() {
  30.         size = 0;
  31.         front = nullptr;
  32.         next = nullptr;
  33.         arr = nullptr;
  34.     }
  35.     // добавление в начало
  36.     virtual void addfront(T x) {
  37.         if(front == nullptr) {
  38.             front = new Element;
  39.             front->next = nullptr;
  40.             front->value = x;
  41.         }
  42.         else {
  43.             Element* mesto = front;
  44.             front = new Element;
  45.             front->next = mesto;
  46.             front->value = x;
  47.             size++;
  48.         }
  49.     }
  50.     // удаление с конца
  51.     virtual T pop() {
  52.         T popped;
  53.         Element* forward;
  54.         Element* penult;
  55.         forward = front;
  56.         while (forward->next) {
  57.             penult = forward;
  58.             forward = forward->next;
  59.         }
  60.         popped = forward->value;
  61.         penult->next = nullptr; //?
  62.         delete forward;
  63.         size--;
  64.         return popped;
  65.         }
  66.     // перегрузка оператора [] для того, чтобы к элементам списка было удобнее обращаться
  67.     Element* operator[] (int i) {
  68.         if (i<0 || i>size)
  69.             return NULL;
  70.         Element* cur = front;
  71.         for (int k = 0; k<i; k++) {
  72.             cur = cur->next;
  73.         }
  74.         return cur;
  75.     }
  76.     // функция для перехода от списка к массиву
  77.     virtual T listToArr(T L, int i) {
  78.         if (!arr) {
  79.             arr = new T[size];
  80.         }
  81.         arr[i] = L;
  82.         return 0;
  83.     }
  84.     // фунцкция быстрой сортировки (надо разобраться с ЛУЧШИМ СЛУЧАЕМ)
  85.     virtual void q_sort(int left, size_t right) {
  86.         int l_hold, r_hold;
  87.         l_hold = left;
  88.         r_hold = right;
  89.         T pivot = arr[left];
  90.         while (left < right) {
  91.             while ((arr[right] >= pivot) && (left < right))
  92.                 right--;
  93.             if (left != right) {
  94.                 arr[left] = arr[right];
  95.                 left++;
  96.             }
  97.             while ((arr[left] <= pivot) && (left < right))
  98.                 left++;
  99.             if (left != right) {
  100.                 arr[right] = arr[left];
  101.                 right--;
  102.             }
  103.         }
  104.         arr[left] = pivot;
  105.         pivot = left;
  106.         left = l_hold;
  107.         right = r_hold;
  108.         if (left < pivot)
  109.             q_sort(left, pivot - 1);
  110.         if (right > pivot)
  111.             q_sort(pivot + 1, right);
  112.     }
  113.     // функция для печати, работающая ток с массивом
  114.     virtual void print() {
  115.         for (int i = 0; i <= size; i++)
  116.             cout << arr[i] << " ";
  117.     }
  118.    
  119.     // деструктор
  120.     ~List() {
  121.         cout << "\nList destructor is working" << endl;
  122.         if (arr)
  123.             delete[] arr;
  124.         arr = NULL;
  125.         while (size)
  126.             pop();
  127.     }
  128.    
  129. };
  130.  
  131.  
  132. int main() {
  133.     List<char> L;
  134.     //List<int> L;
  135.    
  136.     L.addfront('a');
  137.     //L.addfront(0);
  138.     L.addfront('b');
  139.     //L.addfront(1);
  140.     L.addfront('c');
  141.     //L.addfront(2);
  142.     L.addfront('d');
  143.     //L.addfront(3);
  144.     L.addfront('e');
  145.    
  146.     cout << "\nЭлементы нашего списка, добавляющиеся в начало: " << endl;
  147.    
  148.     for (int i = 0; i <= L.size; i++) {
  149.         L.listToArr(L[i]->value, i);
  150.         cout << L.arr[i] << " ";
  151.     }
  152.    
  153.     cout << "\n\nУдалили элемент с конца. Вот этот элемент: " << L.pop() << endl;
  154.    
  155.     cout << endl << "Переписали список в массив, применили быструю сортировку: \n";
  156.     L.q_sort(0, L.size);
  157.    
  158.     L.print();
  159.    
  160.     cout << endl;
  161.    
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement