Dodawanie do drzewa binarnego iteracyjnie

0

Witam, mam problem z dodawaniem iteracyjnym do drzewa BST, kod kompiluje się jednak nie wyswietla zadnych elementow (wyglada na to że drzewo jest puste). Gdzie może leżec błąd?

 
#include <stdio.h>

struct elDrzewaB
{
 	int klucz ;
 	struct elDrzewaB *lewy;
	struct elDrzewaB *prawy;
	int licznik;
};
typedef struct elDrzewaB wDrzewaB;
typedef wDrzewaB* drzewo;

void Wyswietl(drzewo d)
{
	if(d)
	{
		if(d->lewy)
			Wyswietl(d->lewy);
		printf("%d ", d->klucz);
		if(d->prawy)
			Wyswietl(d->prawy);	
	}
}

void DodajDo(drzewo *d, int klucz)
{
	drzewo elem;
	elem=(drzewo*)malloc(sizeof(wDrzewaB));
	drzewo p=*d;
	drzewo tmp=0;
	elem->klucz=klucz;
	elem->lewy=elem->prawy=0;
	elem->licznik=1;
	if(!p)
	{
		p=elem;
	}
	else
	{
		while(p!=0)
		{
			if(p->klucz>klucz)
			{
				tmp=p;
				p=p->lewy;
			}
			else if(p->klucz<klucz)
			{
				tmp=p;
				p=p->prawy;
			}
			else
				p->licznik++;
		}	
	        if(p==0)
	        {
		       if(p->klucz>klucz)
			       p->lewy=elem;
		       else
			       p->prawy=elem;
                }
	}
}


int main(){
drzewo _d = 0;
DodajDo(&_d, 44);
DodajDo(&_d, 43);
DodajDo(&_d, 42);
DodajDo(&_d, 46);
Wyswietl(_d);
}
1

Pierwszym problemem jest to, że przekazujesz do DodajDo() wskaźnik na drzewo, ale nic z tym drzewem później nie robisz. Robisz sobie p=*d, a potem p=elem, co sprawia, że *d wcale się nie zmienia.

0

Czyli w tym przypadku p jest zupełnie niepotrzebne i działać na *d?

1

Po pierwsze, nie wiem jaki był Twój pomysł ze zmienną tmp, ale jej nie używasz.

Poza tym, spójrz sobie na ciało if (p == 0). Z jednej strony chcesz, żeby p było pustym wskaźnikiem, a z drugiej próbujesz się dobierać do wartości na którą p wskazuje.

1

Udalo sie ogarnac i tak wyglada dzialajacy kod, dzieki wielkie za pomoc

void DodajDo(drzewo *d, int klucz)
{
drzewo p=0;
drzewo nowy=0;
drzewo pop=nowy;
nowy=(drzewo*)malloc(sizeof(wDrzewaB));
nowy->lewy=nowy->prawy=0;
nowy->klucz=klucz;
nowy->licznik=1;
p=*d;
while (p!=0)
{
	pop=p;
	if (p->klucz>klucz)
		p=p->lewy;
	else if(p->klucz<klucz)
		p=p->prawy;
	else 
		p->licznik++;
}
if((*d)==0)
	*d=nowy;
else if(pop->klucz>klucz)
	pop->lewy=nowy;
else
	pop->prawy=nowy; 
}

 

1 użytkowników online, w tym zalogowanych: 0, gości: 1