Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <cstring>
- #include <cstdio>
- #include <string>
- #include <fstream>
- using namespace std;
- int ileprze = 0;
- ofstream zapis("out.txt", ios::out);
- struct koleczko
- {
- string wyraz;
- koleczko *rodzic;
- koleczko *lewo;
- koleczko *prawo;
- };
- struct koleczko *root;
- struct slownik
- {
- struct koleczko* znajdz_min_na_lewo(struct koleczko *start)
- {
- if(start->lewo !=NULL)
- {
- return znajdz_min_na_lewo(start->lewo);
- }
- else
- return start;
- }
- void rysuj_drzewo (struct koleczko *start, int poziom=0) // WERSJA BETA
- {
- if(start !=NULL)
- {
- cout<<start->wyraz<<" "<<endl;
- rysuj_drzewo(start->prawo, poziom+4);
- rysuj_drzewo(start->lewo, poziom+4);
- cout<<setw(poziom)<<' ';
- }
- }
- void add_word(string wyraz1,struct koleczko *start)
- {
- if(root==NULL)
- {
- koleczko *nowe = new koleczko;
- root=nowe;
- nowe->prawo=NULL;
- nowe->lewo=NULL;
- nowe->rodzic=NULL;
- nowe->wyraz=wyraz1;
- }
- else if(wyraz1 < start->wyraz) // jezeli nowy wyraz jest "mniejszy" to dodajemy go do lewej galezi
- {
- if(start->lewo != NULL)
- {
- add_word(wyraz1,start->lewo);
- }
- else
- {
- koleczko *help = new koleczko;
- help->wyraz=wyraz1;
- help->prawo=NULL;
- help->lewo=NULL;
- help->rodzic=start;
- start->lewo=help;
- }
- }
- else
- {
- if(start->prawo != NULL)
- {
- add_word(wyraz1,start->prawo);
- }
- else
- {
- koleczko *help = new koleczko;
- help->wyraz=wyraz1;
- help->prawo=NULL;
- help->lewo=NULL;
- help->rodzic=start;
- start->prawo=help;
- }
- }
- }
- struct koleczko* szukaj(struct koleczko *start, string szukany) //szukanie wezla
- {
- if (start->wyraz==szukany)
- {
- //cout<<"\nWyraz \""<<szukany<<"\" istnieje w slowniku";
- zapis<<"TAK"<<endl;
- return start;
- }
- else if (szukany < start->wyraz && start->lewo != NULL)
- {
- return szukaj(start->lewo,szukany);
- }
- else if (szukany > start->wyraz && start->prawo != NULL)
- {
- return szukaj(start->prawo,szukany);
- }
- zapis<<"NIE"<<endl;
- return NULL;
- };
- int usun(struct koleczko *del)
- {
- if(del==NULL)
- {
- return 2;
- }
- if(del->lewo==NULL && del->prawo==NULL) // brak podkolek
- {
- if(del->rodzic==NULL) // jezeli koleczko jest korzeniem bez dzieci ( podkolka )
- {
- root=NULL;
- }
- else if(del->rodzic->lewo==del) //l jezeli koleczko jest po lewej stronie rodzica
- {
- del->rodzic->lewo=NULL; // usun lewy wezel rodzica
- }
- else // w innym wypadku jestem po prawej stronie
- {
- del->rodzic->prawo=NULL; // usun prawy wezel od rodzica
- }
- delete del;
- }
- else if(del->lewo==NULL || del->prawo==NULL) // je¿eli ma jedno dziecko
- {
- if(del->lewo==NULL) // Jezeli po lewej stronie nie ma PODKOLECZKA
- {
- if(del->rodzic==NULL) // jest korzeniem
- {
- root=del->prawo;
- }
- else if(del->rodzic->lewo==del) //jezeli wezel jest po lewej stronie rodzica
- {
- del->rodzic->lewo=del->prawo; // wez prawy weze; z usuwanego wezla
- }
- else
- {
- del->rodzic->prawo=del->prawo; // przyczeo prawego dzieciaka
- }
- }
- else
- {
- if(del->rodzic==NULL) // jest korzeniem
- {
- root=del->lewo;
- }
- else if(del->rodzic->lewo==del) //jezeli wezel jest po lewej stronie rodzica
- {
- del->rodzic->lewo=del->lewo; // wez lewy weze; z usuwanego wezla
- }
- else
- {
- del->rodzic->prawo=del->lewo; // przyczeo prawego dzieciaka
- }
- }
- delete del;
- }
- else
- // wstawianie w miejsce del elem,entu najmniejszej wartosci z prawego poddrzewa
- {
- struct koleczko *help;
- help=znajdz_min_na_lewo(del->prawo);
- del->wyraz = help->wyraz;
- usun(help);
- }
- }
- int szukaj_przedrostka(struct koleczko *start, string szukany) // NIE ROZUMIEM DLACZEGO NIE DZIALA
- {
- string help;
- help=start->wyraz;
- if (start->wyraz.find(szukany) != std::string::npos && help[0]==szukany[0] && help[1]==szukany[1])
- {
- // cout<<"\nPrzedrostek \""<<szukany<<"\" istnieje w slowie: "<<help;
- ileprze++;
- }
- if (szukany < start->wyraz && start->lewo != NULL)
- {
- return szukaj_przedrostka(start->lewo,szukany);
- }
- if (szukany > start->wyraz && start->prawo != NULL)
- {
- return szukaj_przedrostka(start->prawo,szukany);
- }
- return ileprze;
- };
- struct koleczko* szukaj_wiekszego(struct koleczko *start, string szukany) //szukanie wezla
- {
- if (start->wyraz > szukany)
- {
- cout<<"\nWyraz \""<<start->wyraz<<"\" jest pierwszym leksygraficznie wiekszym slowem od "<< szukany;
- return start;
- }
- else if (szukany > start->wyraz && start->lewo != NULL)
- {
- return szukaj_wiekszego(start->prawo,szukany);
- }
- return NULL;
- };
- void zapis_do_pliku(struct koleczko *start)
- {
- if(start->lewo !=NULL)
- {
- zapis_do_pliku(start->lewo);
- }
- zapis<<start->wyraz<<endl;
- if(start->prawo != NULL)
- {
- zapis_do_pliku(start->prawo);
- }
- }
- void wyswietl(struct koleczko *rozw, int poziom)
- {
- if (rozw != NULL)
- {
- wyswietl(rozw->prawo, poziom + 1);
- cout << endl;
- //zapis<<endl;
- if (rozw == root)
- cout <<"-> ";
- //zapis<<"-> ";
- for (int i = 0; i < poziom; i++)
- if (rozw != root)
- {
- cout << " ";
- // zapis << " ";
- }
- cout << rozw->wyraz;
- // zapis << rozw->wyraz;
- wyswietl(rozw->lewo, poziom + 1);
- }
- }
- int nieoptymalnie_szukanie_przedrostkow(struct koleczko *start, string elo)
- {
- if(start->lewo !=NULL)
- {
- nieoptymalnie_szukanie_przedrostkow(start->lewo, elo);
- }
- if (start->wyraz.find(elo) != std::string::npos && elo[0]==start->wyraz[0] && elo[1]==start->wyraz[1] && elo[2]==start->wyraz[2] )
- {
- // cout<<"\nPrzedrostek \""<<elo<<"\" istnieje w slowie: "<<start->wyraz;
- ileprze++;
- }
- if(start->prawo != NULL)
- {
- nieoptymalnie_szukanie_przedrostkow(start->prawo, elo);
- }
- return ileprze;
- }
- struct koleczko* szukaj_silent(struct koleczko *start, string szukany) //szukanie wezla
- {
- if (start->wyraz==szukany)
- {
- return start;
- }
- else if (szukany < start->wyraz && start->lewo != NULL)
- {
- return szukaj_silent(start->lewo,szukany);
- }
- else if (szukany > start->wyraz && start->prawo != NULL)
- {
- return szukaj_silent(start->prawo,szukany);
- }
- return NULL;
- };
- };
- int main()
- {
- slownik *pierwszy = new slownik;
- root = NULL;
- int ilosc_polecen = 0;
- ifstream dane;
- string polecenie;
- string pol_pomoc;
- dane.open("duzy3.txt");
- dane>>ilosc_polecen;
- for (int i=0; i<ilosc_polecen;i++)
- {
- dane>>polecenie;
- dane>>pol_pomoc;
- if(polecenie=="ADD")
- {
- pierwszy->add_word(pol_pomoc,root);
- }
- if(polecenie=="DEL") // usun
- {
- pierwszy->usun(pierwszy->szukaj_silent(root,pol_pomoc));
- }
- if(polecenie=="FIN") //szukaj
- {
- pierwszy->szukaj(root,pol_pomoc);
- }
- if(polecenie=="OP") // prefiks ile
- {
- //cout<<"\nIlosc przedrostkow "<<pol_pomoc<<" w slowniku wynosi: "<<pierwszy->nieoptymalnie_szukanie_przedrostkow(root,pol_pomoc);
- zapis<<pierwszy->szukaj_przedrostka(root,pol_pomoc)<<endl;
- ileprze = 0;
- }
- if(polecenie=="MAX") // pierwsze wieksze slowo
- {
- pierwszy->szukaj_wiekszego(root,pol_pomoc);
- }
- }
- //pierwszy->zapis_do_pliku(root);
- // pierwszy->szukaj_przedrostka(root,"pie");
- //pierwszy->wyswietl(root,0); //WYPISYWANIE DRZEWA DO KONSOLILILI
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment