MarVin666

DrzewoBST

Jun 1st, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <string>
  6. #include <fstream>
  7.  
  8. using namespace std;
  9.  
  10. int ileprze = 0;
  11. ofstream zapis("out.txt", ios::out);
  12.  
  13. struct koleczko
  14. {
  15.     string wyraz;
  16.     koleczko *rodzic;
  17.     koleczko *lewo;
  18.     koleczko *prawo;
  19. };
  20. struct koleczko *root;
  21. struct slownik
  22. {
  23.         struct koleczko* znajdz_min_na_lewo(struct koleczko *start)
  24.         {
  25.             if(start->lewo !=NULL)
  26.             {
  27.                 return znajdz_min_na_lewo(start->lewo);
  28.             }
  29.             else
  30.             return start;
  31.         }
  32.         void rysuj_drzewo (struct koleczko *start, int poziom=0) // WERSJA BETA
  33.         {
  34.             if(start !=NULL)
  35.             {
  36.  
  37.  
  38.                 cout<<start->wyraz<<"  "<<endl;
  39.                 rysuj_drzewo(start->prawo, poziom+4);
  40.                 rysuj_drzewo(start->lewo, poziom+4);
  41.  
  42.                 cout<<setw(poziom)<<' ';
  43.  
  44.             }
  45.         }
  46.         void add_word(string wyraz1,struct koleczko *start)
  47.         {
  48.  
  49.             if(root==NULL)
  50.             {
  51.                 koleczko *nowe = new koleczko;
  52.                 root=nowe;
  53.                 nowe->prawo=NULL;
  54.                 nowe->lewo=NULL;
  55.                 nowe->rodzic=NULL;
  56.                 nowe->wyraz=wyraz1;
  57.             }
  58.             else if(wyraz1 < start->wyraz)   // jezeli nowy wyraz jest "mniejszy" to dodajemy go do lewej galezi
  59.             {
  60.                 if(start->lewo != NULL)
  61.                 {
  62.                     add_word(wyraz1,start->lewo);
  63.                 }
  64.                 else
  65.                 {
  66.                     koleczko *help = new koleczko;
  67.                     help->wyraz=wyraz1;
  68.                     help->prawo=NULL;
  69.                     help->lewo=NULL;
  70.                     help->rodzic=start;
  71.                     start->lewo=help;
  72.                 }
  73.             }
  74.             else
  75.             {
  76.                 if(start->prawo != NULL)
  77.                 {
  78.                     add_word(wyraz1,start->prawo);
  79.                 }
  80.                 else
  81.                 {
  82.                     koleczko *help = new koleczko;
  83.                     help->wyraz=wyraz1;
  84.                     help->prawo=NULL;
  85.                     help->lewo=NULL;
  86.                     help->rodzic=start;
  87.                     start->prawo=help;
  88.                 }
  89.             }
  90.         }
  91.         struct koleczko* szukaj(struct koleczko *start, string szukany)  //szukanie wezla
  92.         {
  93.  
  94.             if (start->wyraz==szukany)
  95.             {
  96.                 //cout<<"\nWyraz \""<<szukany<<"\" istnieje w slowniku";
  97.                 zapis<<"TAK"<<endl;
  98.                 return start;
  99.             }
  100.             else if (szukany < start->wyraz && start->lewo != NULL)
  101.             {
  102.                 return szukaj(start->lewo,szukany);
  103.             }
  104.             else if (szukany > start->wyraz && start->prawo != NULL)
  105.             {
  106.                 return szukaj(start->prawo,szukany);
  107.             }
  108.             zapis<<"NIE"<<endl;
  109.             return NULL;
  110.         };
  111.         int usun(struct koleczko *del)
  112.         {
  113.             if(del==NULL)
  114.             {
  115.                 return 2;
  116.             }
  117.             if(del->lewo==NULL && del->prawo==NULL) // brak podkolek
  118.             {
  119.                     if(del->rodzic==NULL)      // jezeli koleczko jest korzeniem bez dzieci ( podkolka )
  120.                     {
  121.                         root=NULL;
  122.                     }
  123.                     else if(del->rodzic->lewo==del) //l jezeli koleczko jest po lewej stronie rodzica
  124.                     {
  125.                         del->rodzic->lewo=NULL;       // usun lewy wezel rodzica
  126.                     }
  127.                     else // w innym wypadku jestem po prawej stronie
  128.                     {
  129.                         del->rodzic->prawo=NULL; // usun prawy wezel od rodzica
  130.                     }
  131.                     delete del;
  132.             }
  133.             else if(del->lewo==NULL || del->prawo==NULL) // je¿eli ma jedno dziecko
  134.             {
  135.                     if(del->lewo==NULL) // Jezeli po lewej stronie nie ma PODKOLECZKA
  136.                     {
  137.                             if(del->rodzic==NULL) // jest korzeniem
  138.                             {
  139.                                 root=del->prawo;
  140.                             }
  141.                             else if(del->rodzic->lewo==del) //jezeli wezel jest po lewej stronie rodzica
  142.                             {
  143.                                 del->rodzic->lewo=del->prawo; // wez prawy weze; z usuwanego wezla
  144.                             }
  145.                             else
  146.                             {
  147.                                 del->rodzic->prawo=del->prawo; // przyczeo prawego dzieciaka
  148.                             }
  149.                     }
  150.                     else
  151.                     {
  152.                             if(del->rodzic==NULL) // jest korzeniem
  153.                             {
  154.                                 root=del->lewo;
  155.                             }
  156.                             else if(del->rodzic->lewo==del) //jezeli wezel jest po lewej stronie rodzica
  157.                             {
  158.                                 del->rodzic->lewo=del->lewo; // wez lewy weze; z usuwanego wezla
  159.                             }
  160.                             else
  161.                             {
  162.                                 del->rodzic->prawo=del->lewo; // przyczeo prawego dzieciaka
  163.                             }
  164.                     }
  165.                     delete del;
  166.             }
  167.             else
  168.             // wstawianie w miejsce del elem,entu najmniejszej wartosci z prawego poddrzewa
  169.             {
  170.                 struct koleczko *help;
  171.                 help=znajdz_min_na_lewo(del->prawo);
  172.                 del->wyraz = help->wyraz;
  173.                 usun(help);
  174.             }
  175.         }
  176.         int szukaj_przedrostka(struct koleczko *start, string szukany)   // NIE ROZUMIEM DLACZEGO NIE DZIALA
  177.         {
  178.             string help;
  179.             help=start->wyraz;
  180.  
  181.             if (start->wyraz.find(szukany) != std::string::npos  && help[0]==szukany[0] && help[1]==szukany[1])
  182.             {
  183.                // cout<<"\nPrzedrostek \""<<szukany<<"\" istnieje w slowie: "<<help;
  184.                 ileprze++;
  185.             }
  186.             if (szukany < start->wyraz && start->lewo != NULL)
  187.             {
  188.                 return szukaj_przedrostka(start->lewo,szukany);
  189.             }
  190.  
  191.             if (szukany > start->wyraz && start->prawo != NULL)
  192.             {
  193.                 return szukaj_przedrostka(start->prawo,szukany);
  194.             }
  195.             return ileprze;
  196.         };
  197.  
  198.         struct koleczko* szukaj_wiekszego(struct koleczko *start, string szukany)  //szukanie wezla
  199.         {
  200.  
  201.             if (start->wyraz > szukany)
  202.             {
  203.                 cout<<"\nWyraz \""<<start->wyraz<<"\" jest pierwszym leksygraficznie wiekszym slowem od "<< szukany;
  204.                 return start;
  205.             }
  206.             else if (szukany > start->wyraz && start->lewo != NULL)
  207.             {
  208.                 return szukaj_wiekszego(start->prawo,szukany);
  209.             }
  210.             return NULL;
  211.         };
  212.         void zapis_do_pliku(struct koleczko *start)
  213.         {
  214.         if(start->lewo !=NULL)
  215.         {
  216.             zapis_do_pliku(start->lewo);
  217.         }
  218.  
  219.             zapis<<start->wyraz<<endl;
  220.  
  221.         if(start->prawo != NULL)
  222.         {
  223.             zapis_do_pliku(start->prawo);
  224.         }
  225.     }
  226.         void wyswietl(struct koleczko *rozw, int poziom)
  227.         {
  228.                 if (rozw != NULL)
  229.                 {
  230.                         wyswietl(rozw->prawo, poziom + 1);
  231.                                 cout << endl;
  232.                                 //zapis<<endl;
  233.                                 if (rozw == root)
  234.                                         cout <<"-> ";
  235.                                         //zapis<<"-> ";
  236.                                 for (int i = 0; i < poziom; i++)
  237.                                         if (rozw != root)
  238.                                         {
  239.                                             cout << "         ";
  240.                                            // zapis << "         ";
  241.                                         }
  242.                                                 cout << rozw->wyraz;
  243.                                                // zapis << rozw->wyraz;
  244.                                                 wyswietl(rozw->lewo, poziom + 1);
  245.                 }
  246.         }
  247.         int nieoptymalnie_szukanie_przedrostkow(struct koleczko *start, string elo)
  248.         {
  249.         if(start->lewo !=NULL)
  250.         {
  251.             nieoptymalnie_szukanie_przedrostkow(start->lewo, elo);
  252.         }
  253.  
  254.         if (start->wyraz.find(elo) != std::string::npos  && elo[0]==start->wyraz[0] && elo[1]==start->wyraz[1] && elo[2]==start->wyraz[2] )
  255.             {
  256.                // cout<<"\nPrzedrostek \""<<elo<<"\" istnieje w slowie: "<<start->wyraz;
  257.                 ileprze++;
  258.             }
  259.         if(start->prawo != NULL)
  260.         {
  261.             nieoptymalnie_szukanie_przedrostkow(start->prawo, elo);
  262.         }
  263.         return ileprze;
  264.     }
  265.     struct koleczko* szukaj_silent(struct koleczko *start, string szukany)  //szukanie wezla
  266.         {
  267.  
  268.             if (start->wyraz==szukany)
  269.             {
  270.                 return start;
  271.             }
  272.             else if (szukany < start->wyraz && start->lewo != NULL)
  273.             {
  274.                 return szukaj_silent(start->lewo,szukany);
  275.             }
  276.             else if (szukany > start->wyraz && start->prawo != NULL)
  277.             {
  278.                 return szukaj_silent(start->prawo,szukany);
  279.             }
  280.             return NULL;
  281.         };
  282. };
  283.  
  284. int main()
  285. {
  286.     slownik *pierwszy = new slownik;
  287.     root = NULL;
  288.     int ilosc_polecen = 0;
  289.     ifstream dane;
  290.     string polecenie;
  291.     string pol_pomoc;
  292.     dane.open("duzy3.txt");
  293.     dane>>ilosc_polecen;
  294.     for (int i=0; i<ilosc_polecen;i++)
  295.     {
  296.         dane>>polecenie;
  297.         dane>>pol_pomoc;
  298.         if(polecenie=="ADD")
  299.         {
  300.             pierwszy->add_word(pol_pomoc,root);
  301.         }
  302.         if(polecenie=="DEL") // usun
  303.         {
  304.             pierwszy->usun(pierwszy->szukaj_silent(root,pol_pomoc));
  305.         }
  306.         if(polecenie=="FIN") //szukaj
  307.         {
  308.             pierwszy->szukaj(root,pol_pomoc);
  309.         }
  310.         if(polecenie=="OP") // prefiks ile
  311.         {
  312.             //cout<<"\nIlosc przedrostkow "<<pol_pomoc<<" w slowniku wynosi: "<<pierwszy->nieoptymalnie_szukanie_przedrostkow(root,pol_pomoc);
  313.             zapis<<pierwszy->szukaj_przedrostka(root,pol_pomoc)<<endl;
  314.             ileprze = 0;
  315.         }
  316.         if(polecenie=="MAX") // pierwsze wieksze slowo
  317.         {
  318.             pierwszy->szukaj_wiekszego(root,pol_pomoc);
  319.         }
  320.     }
  321.     //pierwszy->zapis_do_pliku(root);
  322.    // pierwszy->szukaj_przedrostka(root,"pie");
  323.   //pierwszy->wyswietl(root,0); //WYPISYWANIE DRZEWA DO KONSOLILILI
  324.     return 0;
  325. }
Advertisement
Add Comment
Please, Sign In to add comment