Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <sstream>
  7.  
  8.  
  9. using namespace std;
  10.  
  11.  
  12. class Node {
  13. public:
  14.     float val;
  15.     Node *prev;
  16.     Node *next;
  17.     Node() {
  18.         prev = nullptr;
  19.         next = nullptr;
  20.     }
  21.     ~Node() {}
  22. };
  23.  
  24.  
  25. class List {
  26. private:
  27.     std::fstream file;
  28.     Node *head, *tail;
  29.     int count = 0;
  30.  
  31.  
  32.  
  33.  
  34. public:
  35.     List() {
  36.         head = nullptr;
  37.         tail = nullptr;
  38.  
  39.  
  40.     }
  41.     ~List() {
  42.         Node* current = head;
  43.         Node* next;
  44.  
  45.         while (current)
  46.         {
  47.             next = current->next;
  48.             delete current;
  49.             current = next;
  50.         }
  51.  
  52.         head = nullptr;
  53.     }
  54.  
  55.     void push_front(float v)
  56.     {
  57.         Node * p;
  58.  
  59.         p = new Node;
  60.         p->val = v;
  61.         p->prev = NULL;
  62.         p->next = head;
  63.         head = p;
  64.         count++;
  65.         if (p->next) p->next->prev = p;
  66.         else tail = p;
  67.     }
  68.  
  69.     void push_back(float v)
  70.     {
  71.         Node * p;
  72.  
  73.         p = new Node;
  74.         p->val = v;
  75.         p->next = NULL;
  76.         p->prev = tail;
  77.         tail = p;
  78.         count++;
  79.         if (p->prev) p->prev->next = p;
  80.         else head = p;
  81.     }
  82.     void remove(Node * e)
  83.     {
  84.         count--;
  85.         if (e->prev) e->prev->next = e->next;
  86.         else        head = e->next;
  87.         if (e->next) e->next->prev = e->prev;
  88.         else        tail = e->prev;
  89.         delete e;
  90.     }
  91.  
  92.     void pop_front()
  93.     {
  94.         if (count) remove(head);
  95.     }
  96.  
  97.  
  98.     void pop_back()
  99.     {
  100.         if (count) remove(tail);
  101.     }
  102.     void partition(Node * Lw, Node * Pw)
  103.     {
  104.         Node * p, *i, *j;
  105.  
  106.         p = Lw->next;      // piwot
  107.         i = p->next;
  108.         if (i != Pw)
  109.         {
  110.             do            // szukamy elementów mniejszych od piwota
  111.             {
  112.                 j = i;
  113.                 i = i->next;
  114.                 if (j->val < p->val)
  115.                 {
  116.                     j->prev->next = j->next; // znaleziony element wyciagamy z listy
  117.                     j->next->prev = j->prev;
  118.                     j->next = p;             // i umieszczamy go przed piwotem
  119.                     j->prev = p->prev;
  120.                     p->prev = j;
  121.                     j->prev->next = j;
  122.                 }
  123.             } while (i != Pw);
  124.  
  125.             if (Lw->next != p) partition(Lw, p);
  126.             if (p->next != Pw) partition(p, Pw);
  127.  
  128.         }
  129.     }
  130.  
  131.     void quick_sort()
  132.     {
  133.         if (count > 1)
  134.         {
  135.             push_front(0);        // dodajemy lewego wartownika
  136.             push_back(0);         // dodajemy prawego wartownika
  137.             partition(head, tail); // tworzymy partycje
  138.             pop_back();           // usuwamy prawego wartownika
  139.             pop_front();          // usuwamy lewego wartownika
  140.         }
  141.     }
  142.  
  143.     void insertFromFile(int min, int max, std::string name) {
  144.  
  145.         file.open(name + ".txt");
  146.  
  147.         //to sprawdzenie to tymczasowe, trzeba chyba na asercje zmienic\/\/
  148.         if (file.good())
  149.         {
  150.             cout << "Otwarto plik\n";
  151.         }
  152.         else
  153.         {
  154.             cout << "Nie mozna otworzyc\n";
  155.         }
  156.         //asercja, zeby sprawdzalo czy plik sie otworzyl i czy nazwa podana istnieje w katalogu
  157.        
  158.         float value;       
  159.  
  160.        
  161.         while (file>>value) { //zmienilem warunek bo mi dublowalo ostatnią  wartość z pliku
  162.  
  163.             //tutaj asercje, zeby sprawdzalo czy za wczesnie nie zostal osiagniety koniec pliku (podany zakres wiekszy niz ilosc liczb w pliku)
  164.             //mozna np. najpierw policzyc ilosc liczb w pliku i porownac z range ale to nie jest hehe optymalne
  165.             //no albo na biezaco sprawdzac czy sie zgadza
  166.             //if (file.eof()) break;
  167.  
  168.             Node* newValue = new Node;
  169.            
  170.            
  171.             if (value <= max && value >= min) {
  172.                 /*if (!head)
  173.                 {
  174.                     this->count++;
  175.                     head = newValue;
  176.                     newValue->prev = nullptr;
  177.                     newValue->val = value;
  178.                     newValue->next = nullptr;
  179.                     tail = newValue;                   
  180.                 }
  181.                 else
  182.                 {
  183.                     this->count++;
  184.                     newValue->next = head;
  185.                     newValue->val = value;
  186.                     newValue->prev = nullptr;
  187.                     head->prev = newValue;
  188.                     head = newValue;
  189.                 }*/
  190.                 this->push_front(value); //dodalem funkcje dodawania, potrzebna byla w sorcie, także góra do wywalenia
  191.             }
  192.         }
  193.         //jak zwolnic pamiec po tym newValue??? bo juz sie wkurwiam ^^
  194.         //delete[] newValue chyba, ale nie wiem xD
  195.         file.close();
  196.        
  197.        
  198.         cout << "\nPrzed sortowaniem: \n";
  199.         this->printFromLeft();
  200.         quick_sort();
  201.         cout << "Posortowano quick sort'em: \n";
  202.  
  203.     }
  204.     void printFromLeft() {
  205.  
  206.         Node* temp;
  207.         temp = head;
  208.         std::cout << "Lista od lewej:" << std::endl;
  209.         while (temp)
  210.         {
  211.             std::cout << temp->val << std::endl;
  212.             temp = temp->next;
  213.         }
  214.         std::cout << std::endl;
  215.  
  216.  
  217.     }
  218.     void printFromRight() {
  219.         Node* temp;
  220.         temp = tail;
  221.         std::cout << "Lista od prawej:" << std::endl;
  222.         while (temp)
  223.         {
  224.             std::cout << temp->val << std::endl;
  225.             temp = temp->prev;
  226.         }
  227.         std::cout << std::endl;
  228.     }
  229.  
  230. };
  231.  
  232.  
  233.  
  234. //parametry programu wpisane w formacie: "nazwa pliku" min max
  235. int main(int argc, char *argv[]) {
  236.  
  237.     int val_min, val_max;
  238.     if (argc >= 3)
  239.     {
  240.         std::istringstream iss(argv[2]);
  241.  
  242.         if (iss >> val_min) {}
  243.  
  244.         std::istringstream iss2(argv[3]);
  245.  
  246.         if (iss2 >> val_max) {}
  247.     }
  248.     cout << "Zakres: " << val_min << " - " << val_max << endl;
  249.     List list;
  250.     list.insertFromFile(val_min ,val_max, argv[1]);
  251.     list.printFromLeft();
  252.     list.printFromRight();
  253.  
  254.    
  255.  
  256.     system("pause");
  257.     return 0;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement