Cześć
Rozpocząłem zabawę z drzewami i niestety słabo mi to wychodzi. Otóż dodaję do drzewa nowe węzły z zawartością i wszystko jest ok. Ładnie się dodają, jednak przy wypisaniu drzewa otrzymuję ostatnio wstawiony element, zamiast całego drzewa. Nie wiem gdzie leży przyczyna takiego zachowania. Czy może nie dodaję innych węzłów czy może one gdzieś po drodze giną. Proszę o pomoc, gdyż w takiej sytuacji tzn. szukania już przez jakiś czas być może nie zauważam oczywistej przyczyny.
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <list>
using namespace std;
typedef enum {RED,BLACK} COLOR;
//typedef struct tnode *Treewsk;
class ksiazka
{
struct tnode /*wezel drzewa*/
{
string nazwisko, imie, adres;
long int numer_komorkowy, numer_domowy, numer_do_pracy;
COLOR kolor;
tnode *lewy, *prawy, *p;
///konstruktor
tnode()
{
nazwisko="";
imie="";
adres="";
lewy=NULL;
prawy=NULL;
p=NULL;
}
tnode(string n, string i, string a, long int nk, long int nd, long int ndp)
{
nazwisko=n;
imie=i;
adres=a;
numer_komorkowy=nk;
numer_domowy=nd;
numer_do_pracy=ndp;
lewy=NULL;
prawy=NULL;
p=NULL;
kolor=(COLOR)1;
}
};
tnode *korzen;
public:
ksiazka() { korzen=NULL; }
~ksiazka() {}
void wypisz_drzewo()
{
cout<<"Nasze drzewo "<<endl;
wypisz_all(korzen);
}
void wypisz_all(tnode *w)
{
if(w!=NULL)
{
wypisz_all(w->lewy);
cout<<w->nazwisko<<" "<<w->imie<<" "<<w->adres;
wypisz_all(w->prawy);
}
}
void wypisz(tnode *w)
{
cout<<w->nazwisko<<" "<<w->imie<<" "<<w->adres<<endl;
}
bool szukaj(tnode* n)
{
while(korzen)
{
if(korzen->nazwisko == n->nazwisko && korzen->imie==n->imie && korzen->adres==n->adres) {return true;}
else
{
if(korzen->nazwisko == n->nazwisko)
{
if(korzen->imie==n->imie)
{
if(korzen->adres < korzen->adres)
{
korzen=korzen->prawy;
}
else
{
korzen=korzen->lewy;
}
}
else if (korzen->imie < n->imie)
korzen=korzen->prawy;
else
korzen=korzen->lewy;
}
else if (korzen->nazwisko < n->nazwisko)
korzen=korzen->prawy;
else
korzen=korzen->lewy;
}
}
return false;
}
tnode *dodaj()
{
string naz="",im="",adr="";
long int nk, nd, ndp;
cout<<"Podaj nazwisko"<<endl;
cin>>naz;
cout<<"Podaj imie"<<endl;
cin>>im;
cout<<"Podaj adres"<<endl;
getline(cin,adr,'\n');
cout<<"Podaj numer komorkowy"<<endl;
cin>>nk;
cout<<"Podaj numer domowy"<<endl;
cin>>nd;
cout<<"Podaj numer do pracy "<<endl;
cin>>ndp;
tnode *nowy = new tnode(naz, im, adr, nk, nd, ndp);
wypisz(nowy);
getch();
return nowy;
}
void insert_bst()
{
if(korzen==NULL)
{
tnode *nowy=dodaj();
korzen=nowy;
korzen->p=NULL;
korzen->lewy=NULL;
korzen->prawy=NULL;
return;
}
else
{
tnode *tmp=korzen;
tnode *n=dodaj();
if(szukaj(n)) {cout<<"znaleziono DUPLIKAT!!!"<<endl; return;}
while(tmp->lewy!=NULL || tmp->prawy!=NULL)
{
//if(korzen->nazwisko == n->nazwisko && korzen->imie==n->imie && korzen->adres==n->adres) {return true;}
//else
if(tmp->nazwisko == n->nazwisko)
{
if(tmp->imie==n->imie)
{
if(tmp->adres < tmp->adres)
{
tmp=tmp->prawy;
}
else
{
tmp=tmp->lewy;
}
}
else if (tmp->imie < n->imie)
tmp=tmp->prawy;
else
tmp=tmp->lewy;
}
else if (tmp->nazwisko < n->nazwisko)
tmp=tmp->prawy;
else
tmp=tmp->lewy;
}
n->p=tmp;
if(tmp->nazwisko.compare(n->nazwisko) == 0)
{
if(tmp->imie.compare(n->imie)==0)
{
if(tmp->adres < tmp->adres)
{
tmp->prawy=n;
}
else
{
tmp->lewy=n;
}
return;
}
else if (tmp->imie < n->imie)
tmp->prawy=n;
else
tmp->lewy=n;
}
else if (tmp->nazwisko < n->nazwisko)
tmp->prawy=n;
else
tmp->lewy=n;
}
}
bool Szukaj_nazwisko(string s)
{
tnode *x=korzen;
while((x!=NULL)&&(s !=x->nazwisko))
if(s < x->nazwisko)x=x->lewy;
else x=x->prawy;
if(s == x->nazwisko )return 1;
else return 0;
}
};
int main()
{
ksiazka ksioo;
ksioo.insert_bst();
cout << "dodano" << endl;
getch();
ksioo.insert_bst();
cout << "dodano" << endl;
getch();
ksioo.insert_bst();
cout << "dodano" << endl;
getch();
ksioo.wypisz_drzewo();
getch();
cout << "Hello world!" << endl;
return 0;
}