Advertisement
MeehoweCK

Untitled

Oct 24th, 2020
641
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.17 KB | None | 0 0
  1. #include <conio.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. template <class T>
  7. struct element_listy
  8. {
  9.     T wartosc;
  10.     element_listy* next;
  11.     element_listy* prev;
  12. };
  13.  
  14. template <class T>
  15. class Lista
  16. {
  17.     element_listy<T>* head;
  18.     element_listy<T>* last;
  19.     unsigned rozmiar;
  20. public:
  21.     Lista();
  22.     ~Lista();
  23.     unsigned size() const
  24.     {
  25.         return rozmiar;
  26.     }
  27.     void dodaj_na_koniec(T);
  28.     void dodaj_na_poczatek(T);
  29.     void clear();
  30.     int szukaj(T);
  31.     void usun_element(unsigned);
  32.     void usun_pierwszy();
  33.     void usun_ostatni();
  34.     void wypisz();
  35.     void szukaj_i_usun(T);
  36.     bool zmien_wartosc(T, unsigned);
  37.     bool dodaj_na_pozycje(T, unsigned);
  38.     void dodaj_porzadkowo(T);
  39. };
  40.  
  41. template <class T>
  42. Lista<T>::Lista() : head(nullptr), rozmiar(0) {}
  43.  
  44. template <class T>
  45. Lista<T>::~Lista()
  46. {
  47.     element_listy<T>* temp;
  48.     element_listy<T>* pretemp=nullptr;
  49.  
  50.     while (head)
  51.     {
  52.         temp = head;
  53.  
  54.         // przechodzimy na koniec listy:
  55.         while (temp->next)
  56.         {
  57.             pretemp = temp;
  58.             temp = temp->next;
  59.         }
  60.         delete temp;
  61.         pretemp->next = nullptr;
  62.  
  63.         if (pretemp == head)     // zostaje ostatni element
  64.         {
  65.             delete head;
  66.             head = nullptr;
  67.             cout << "Usunieto element\n";
  68.         }
  69.         cout << "Usunieto element\n";
  70.     }
  71.     cout << "Koniec destruktora\n";
  72. }
  73.  
  74. template <class T>
  75. void Lista<T>::dodaj_na_koniec(T value)
  76. {
  77.     element_listy<T>* nowy = new element_listy<T>;
  78.     nowy->wartosc = value;
  79.     nowy->next = nullptr;
  80.  
  81.     // pierwszy element listy:
  82.     if (head == nullptr)
  83.     {
  84.         head = nowy;
  85.         head->prev = nullptr;
  86.         last = head;
  87.         cout << "dodano wartosc " << head->wartosc << endl;
  88.     }
  89.  
  90.     else
  91.     {
  92.         element_listy<T>* temp = head;
  93.         while (temp->next)
  94.             temp = temp->next;
  95.  
  96.         nowy->prev = temp;
  97.         temp->next = nowy;
  98.         cout << "dodano wartosc " << temp->next->wartosc << endl;
  99.         last = nowy;
  100.     }
  101.  
  102.     ++rozmiar;
  103. }
  104.  
  105. template <class T>
  106. void Lista<T>::clear()
  107. {
  108.     element_listy<T>* temp;
  109.     element_listy<T>* pretemp = nullptr;;
  110.  
  111.     while (head)
  112.     {
  113.         temp = head;
  114.  
  115.         // przechodzimy na koniec listy:
  116.         while (temp->next)
  117.         {
  118.             pretemp = temp;
  119.             temp = temp->next;
  120.         }
  121.         delete temp;
  122.         pretemp->next = nullptr;
  123.  
  124.         if (pretemp == head)     // zostaje ostatni element
  125.         {
  126.             delete head;
  127.             head = nullptr;
  128.         }
  129.     }
  130.     rozmiar = 0;
  131. }
  132.  
  133. template <class T>
  134. int Lista<T>::szukaj(T value)
  135. {
  136.  
  137.     if (head->wartosc == value)
  138.         return 0;
  139.  
  140.     element_listy<T>* temp = head->next;
  141.  
  142.     if (temp)
  143.         for (int i = 1; i < rozmiar; ++i)
  144.         {
  145.             if (temp->wartosc == value)
  146.                 return i;
  147.             temp = temp->next;
  148.         }
  149.     else
  150.     {
  151.         return -1;
  152.     }
  153. }
  154.  
  155. template <class T>
  156. void Lista<T>::usun_element(unsigned nr)
  157. {
  158.     if (nr == 0)
  159.     {
  160.         element_listy<T>* temp = head->next;
  161.         delete head;
  162.         head = temp;
  163.         --rozmiar;
  164.  
  165.     }
  166.  
  167.     // kasowanie ostatniego
  168.     else if (nr == rozmiar - 1)
  169.     {
  170.         element_listy<T>* kasowany = head;
  171.         for (unsigned i = 0; i < nr; ++i)
  172.             kasowany = kasowany->next;
  173.  
  174.         element_listy<T>* temp_prev = kasowany->prev;
  175.  
  176.  
  177.         temp_prev->next = nullptr;          // zmiana
  178.  
  179.  
  180.         delete kasowany;
  181.         --rozmiar;
  182.     }
  183.     else
  184.     {
  185.         element_listy<T>* kasowany = head;
  186.         for (unsigned i = 0; i < nr; ++i)
  187.             kasowany = kasowany->next;
  188.  
  189.         element_listy<T>* temp_next = kasowany->next;
  190.         element_listy<T>* temp_prev = kasowany->prev;
  191.  
  192.         temp_prev->next = temp_next;
  193.         temp_next->prev = temp_prev;
  194.  
  195.         delete kasowany;
  196.         --rozmiar;
  197.     }
  198. }
  199.  
  200.  
  201. template<class T>
  202. void Lista<T>::usun_pierwszy()
  203. {
  204.     usun_element(0);
  205. }
  206.  
  207. template<class T>
  208. void Lista<T>::usun_ostatni()
  209. {
  210.     usun_element(rozmiar - 1);
  211. }
  212.  
  213.  
  214. template <class T>
  215. void Lista<T>::wypisz()
  216. {
  217.     cout << "Rozmiar listy: " << rozmiar << endl;
  218.     cout << "Adresy komorek i dane:\n";
  219.  
  220.     element_listy<T>* temp = head;
  221.  
  222.     for (unsigned i = 0; i < rozmiar; ++i)
  223.     {
  224.         cout << '\t' << i << ": " << temp << '\t' << temp->wartosc;
  225.         if(i > 0)
  226.             cout << '\t' << "poprzedni: " << temp->prev;
  227.         cout << endl;
  228.         temp = temp->next;
  229.     }
  230. }
  231.  
  232. template <class T>
  233. void Lista<T>::szukaj_i_usun(T value)
  234. {
  235.     int x = szukaj(value);
  236.     usun_element(x);
  237. }
  238.  
  239. template <class T>
  240. bool Lista<T>::zmien_wartosc(T value, unsigned nr)
  241. {
  242.     if(nr >= rozmiar)
  243.         return false;
  244.  
  245.     if(nr == 0)
  246.     {
  247.         head->wartosc = value;
  248.         return true;
  249.     }
  250.  
  251.     element_listy<T>* temp = head;
  252.     for(unsigned i = 0; i < nr; ++i)
  253.         temp = temp->next;
  254.  
  255.     temp->wartosc = value;
  256.     return true;
  257. }
  258.  
  259. template <class T>
  260. void Lista<T>::dodaj_na_poczatek(T value)
  261. {
  262.     if(rozmiar == 0)
  263.     {
  264.         dodaj_na_koniec(value);
  265.         return;
  266.     }
  267.  
  268.     element_listy<T>* nowy = new element_listy<T>;
  269.     nowy->wartosc = value;
  270.  
  271.     element_listy<T>* temp = head;
  272.     head = nowy;
  273.     head->prev = nullptr;
  274.     head->next = temp;
  275.  
  276.     ++rozmiar;
  277. }
  278.  
  279. template <class T>
  280. bool Lista<T>::dodaj_na_pozycje(T value, unsigned nr)
  281. {
  282.     if(nr > rozmiar) return false;
  283.     if(nr == rozmiar)
  284.     {
  285.         dodaj_na_koniec(value);
  286.         return true;
  287.     }
  288.  
  289.     if(nr == 0)
  290.     {
  291.         dodaj_na_poczatek(value);
  292.         return true;
  293.     }
  294.  
  295.     element_listy<T>* temp = head;
  296.  
  297.     for(unsigned i = 0; i < nr; ++i)
  298.         temp = temp->next;
  299.  
  300.     element_listy<T>* temp_prev = temp->prev;
  301.     element_listy<T>* temp_next = temp;
  302.  
  303.  
  304.     element_listy<T>* nowy = new element_listy<T>;
  305.     nowy->wartosc = value;
  306.     nowy->next = temp_next;
  307.     nowy->prev = temp_prev;
  308.  
  309.     temp_prev->next = nowy;
  310.     temp_next->prev = nowy;
  311.     ++rozmiar;
  312.     return true;
  313. }
  314.  
  315. template <class T>
  316. void Lista<T>::dodaj_porzadkowo(T value)
  317. {
  318.  
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement