Advertisement
Skylighty

listy

Feb 19th, 2019
509
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5.  
  6. class drzewo{
  7. private:
  8.     int iowocow, wiek;
  9. public:
  10.     drzewo *next;
  11.     drzewo *right;
  12.     drzewo *left;
  13.     void wstawl(drzewo *d);
  14.     void wstawdl(drzewo *d);
  15.     void wyswietll();
  16.     void wyswietldl();
  17.     void wyswietldll();
  18.     void wyswietldlr();
  19.     int get_iowocow();
  20.     int get_wiek();
  21.     drzewo();
  22.     drzewo(int q, int w);
  23. };
  24. drzewo::drzewo(){
  25.     next = nullptr; //"next = NULL" rowniez byloby poprawne, ale NULL to wartosc, a nullptr; to wskaznik o wartosci NULL, jest to bardzo wazne
  26.     left = nullptr;
  27.     right = nullptr;
  28.     iowocow = rand() % 1000 + 1;
  29.     wiek = rand() % 200 + 1;
  30. }
  31. drzewo::drzewo(int q, int w){
  32.     next = nullptr;
  33.     left = nullptr;
  34.     right = nullptr;
  35.     iowocow = q;
  36.     wiek = w;
  37. };
  38. int drzewo::get_iowocow() {
  39.     return iowocow;
  40. }
  41. int drzewo::get_wiek() {
  42.     return wiek;
  43. }
  44. void drzewo::wyswietll() {
  45.     cout << "Drzew o ilosci owocow : " << iowocow << " oraz wieku : " << wiek << endl;
  46.     if (next)
  47.         next->wyswietll();
  48. }
  49. void drzewo::wyswietldll() {
  50.     if (left)
  51.         left->wyswietldll(); //cout jest na koncu bo dopiero po dojsciu do ostatniego elementu rekurencja zacznie sie
  52.     cout << "Drzew o ilosci owocow : " << iowocow << " oraz wieku : " << wiek << endl; //"cofac" i wyswietlac od lewej do prawej
  53. }
  54. void drzewo::wyswietldlr(){
  55.     cout << "Drzew o ilosci owocow : " << iowocow << " oraz wieku : " << wiek << endl; //cout na poczatku, by kazde nastepne zagniezdzenie rekurencji
  56.     if (right) //wyswietlalo nastepujace, kazdorazowo drzewa po stronie prawej, az do konca listy (do napotkania NULLa)
  57.         right->wyswietldlr();
  58. }
  59. void drzewo::wyswietldl() { //liste dwukierunkowa wyswietlamy wywolujac dla elementu po lewo wyswietlanie "lewe"
  60.     left->wyswietldll();
  61.     if (right) //oraz pozniej, od roota sprawdzajac czy pod wskaznikiem "nastepnym" jest cokolwiek wyswietlamy w prawo
  62.         right->wyswietldlr(); //do czego uzywamy funkcji skladowych w/w
  63. }
  64. void drzewo::wstawl(drzewo *d) { //wstawianie na liste jednokierunkowa
  65.     if (next) { //jesli istnieje nastepny element
  66.         if (next->iowocow < d->iowocow) //sprawdz czy jego ilosc owocow jest mniejsza niz obiektu wstawianego
  67.             next->wstawl(d); //jesli tak wywolaj funkcje rekurencyjnie dla tego nastepnego elementu
  68.         else { //jesli liczba owocow nastepnego drzewa jest wieksza niz wstawianego
  69.             d->next = next; //nastepny element elementu wstawianego to element nastepny elementu rozwazanego
  70.             next = d; //nastepny element elementu rozwazanego to element wstawiany
  71.         }
  72.     }
  73.     else //jesli nie istnieje nastepny element
  74.         next = d; //element wstawiany staje sie nastepnym elementem
  75. }
  76. void drzewo::wstawdl(drzewo *d) { //wstawianie dla listy dwukierunkowej
  77.     if (iowocow < d->iowocow) //root bedzie elementem "srodkowym", sprawdzamy czy wstawiany el.
  78.     {                          // ma wieksza czy mniejsza ilosc owocow niz root
  79.         if (right) //jesli ma wieksza sprawdzamy czy istnieje element po prawo od roota
  80.         {
  81.             if (right->iowocow < d->iowocow) //sprawdzamy czy ilosc owocow nastepnego elementu po prawo jest wieksza niz i.owocow el. wstawianego
  82.                 right->wstawdl(d); //jesli jest mniejsza, nastepuje wykonanie rekurencyjne funkcji dla nastepnego elementu po prawo
  83.             else //jesli jest wieksza musimy nadpisac wskazniki w strukturze listy
  84.                 {
  85.                 d->right = right; //wskaznik "prawy" el. wstawianego ustawiamy na element nastepny od elementu rozwazanego
  86.                 d->left = this; //wskaznik "lewy" el. wstawianego ustawiamy na "this" czyli element rozwazany w obecnym wykonaniu funkcji
  87.                 right->left = d; //wskaznik "poprzedni" elementu ktory byl nastepny od rozwazanego ustawiamy na element wstawiany
  88.                 right = d; //oraz wskaznik "nastepny" elemenetu rozwazanego ustawiamy na element wstawiany
  89.                 } //dzieki powyzszym nadpisaniom mozemy wstawic obiekt w srodek listy zachowujac pelna strukture listy dwukierunkowej
  90.         }
  91.         else { //jesli nie to wstawiamy po prawo od el. rozwazanego element wstawiany, a jego wsaznik "poprzedni" ustawiamy na el. rozwazany
  92.             right = d;
  93.             d->left = this;
  94.         }
  95.     }
  96.     else //dzialania analogiczne dla przypadku jesli element wstawiany ma mniejsza ilosc owocow niz root
  97.     {
  98.         if (left)
  99.         {
  100.             if (left->iowocow > d->iowocow)
  101.                 left->wstawdl(d);
  102.             else
  103.             {
  104.                 d->left = left;
  105.                 d->right = this;
  106.                 left->right = d;
  107.                 left = d;
  108.             }
  109.         }
  110.         else {
  111.             left = d;
  112.             d->right = this;
  113.         }
  114.     }
  115. }
  116.  
  117. int main() {
  118.     drzewo *rootsingle = new drzewo(); //tworzymy przez wskaznik obiekt bedacy rootem listy jednokierunkowej
  119.     drzewo *rootdouble = new drzewo(); //tworzymy przez wskaznik obiekt bedacy rootem listy dwukierunkowej
  120.     for (int i = 0; i < 50; i++){
  121.         drzewo *nd = new drzewo(); //tworzymy 50 obiektow typu drzewo, ktore dodamy do listy jednokierunkowej
  122.         if (nd->get_iowocow() < rootsingle->get_iowocow()) { //sprawdzamy czy nowoutworzony element nie ma mniejszej i.owocow od roota
  123.             nd->next = rootsingle; //jesli ma, za pomoca odpowiednich napisan wymieniamy roota na jak najmniejszego
  124.             rootsingle = nd;
  125.         }
  126.         else
  127.             rootsingle->wstawl(nd);
  128.     }
  129.     for (int i = 0; i < 100; i++){ //tworzymy 100 obiektow typu drzewo ktore dodamy do listy dwukierunkowej
  130.         drzewo *nd = new drzewo(); //w zwiazku z tym ze liste dwukierunkowa tworzymy od srodka i wyswietlamy "od lewej do prawej"
  131.         rootdouble->wstawdl(nd); //nie ma potrzeby mechanicznego nadpisywania w tym miejscu, bo struktura sortujaca zostanie zachowana
  132.     }
  133.     cout << "Wyswietlam liste jednokierunkowa : " << endl;
  134.     rootsingle->wyswietll();
  135.     cout << endl;
  136.     cout << endl;
  137.     cout << "Wyswietlam liste dwukierunkowa : " << endl;
  138.     rootdouble->wyswietldl();
  139.     system("pause");
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement