• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Drzewo binarne

VPS Starter Arubacloud
0 głosów
378 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)

Witam :) Implementuje drzewo binarne, które ma być drzewem genealogicznym. Stworzyłem dwie struktury, jedna przechowuje dane osoby, a druga odpowiada za węzeł drzewa. Dostaję jednak masę błędów związanych z rzekomym brakiem deklaracji zmiennych "lewy, prawy" itd. oraz errory : expected primary expression before '>'  token ( np. do linii : return naj_lewo(start - >lewy). Zapewne coś mieszam ze wskaźnikami, ale nie mogę się w tym już połapać. Proszę o pomoc/wskazówki. 


 

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <stdio.h>
using namespace std;

struct osoba
{
     string imie;
     string nazwisko;
     int rok_urodzenia;
     string pokrewienstwo;
     string plec;
     osoba *nastepna;
     osoba();
};

osoba::osoba()
{
     nastepna=0;
}
struct wezel
{
      osoba *pierwszy;
     struct osoba *dane;
     struct wezel *lewy;
     struct wezel *prawy;
     struct wezel *rodzic;

     void dodaj_osobe();
     void wypelnij_drzewo(wezel*);
     void wyswietl(wezel*, int);

      wezel();
};
wezel::wezel()
{
pierwszy=0;
}


///////////////////////////////////////////

struct wezel* naj_lewo(struct wezel *start) {
if((start ->lewy) ! = NULL)
return naj_lewo(start - >lewy) ;
else
return start;
}


int dodawanie(osoba* n, struct wezel *start) {
//jezeli drzewo jest puste to dodaj korzen
osoba *temp=pierwszy;
osoba *nowy = new osoba;
if (temp == NULL) {
temp - >nastepna = n;
temp - >lewy = NULL;
temp - >prawy = NULL;
temp - >rodzic = NULL;
}
else
{
     if(plec=="mezczyzna")
     {

nowy - >nastepna = n;
nowy - >lewy = NULL;
nowy - >prawy = NULL;
nowy - >rodzic = start;
start - >lewy = nowy;
}
else if(plec=="kobieta")
{

nowy ->nastepna = n;
nowy ->lewy = NULL;
nowy ->prawy = NULL;
nowy ->rodzic = start;
start ->prawy = nowy;

}
}
return 0;

}

 

komentarz 2 kwietnia 2017 przez mokrowski Mędrzec (156,220 p.)
Ogólna uwaga. Zapoznaj się z nagłówkiem <memory> i wskaźnikami unique_ptr oraz shared_ptr. Za chwilę będziesz miał naprawdę masę problemów które nie dotyczą programu a sposobów wywołań i zwalniania zasobów (taka uroda gołych wskaźników).

1 odpowiedź

+1 głos
odpowiedź 2 kwietnia 2017 przez j23 Mędrzec (195,220 p.)

Dostaję jednak masę błędów związanych z rzekomym brakiem deklaracji zmiennych "lewy, prawy" itd.

Rzekomym?indecision A w którym miejscu struktura osoba ma zdefiniowane pola lewy i prawy?

komentarz 2 kwietnia 2017 przez krzakurts Obywatel (1,470 p.)
Faktycznie nie ma, mam je tylko zdefiniowane w węźle. Właśnie mam  problem jak  to wszystko złączyć aby miało sens. Drzewo binarne na liczbach raczej nie sprawiło mi problemów, jednak jak mam oddzielną strukturę z danymi, to już nie bardzo.
komentarz 2 kwietnia 2017 przez krzakurts Obywatel (1,470 p.)
To raczej nie rozwiąże mojego problemu, bo lewy, prawy, rodzic są odpowiedzialne za rozkład elementów w drzewie. Ogólnie opieram się na tej implementacji : http://www.algorytm.org/klasyczne/drzewa-poszukiwan-binarnych-bst/bst-2-c.html

Tylko że tutaj działa się tylko na liczbach, a nie tak jak u mnie na danych.
komentarz 2 kwietnia 2017 przez j23 Mędrzec (195,220 p.)

Możesz zrobić np. tak (pisane z palca, więc ogą być błędy):

struct wezel
{
	osoba dane;

	wezel *lewy;
	wezel *prawy;
	wezel *rodzic;

	wezel();
};


wezel::wezel()
	:lewy(nullptr), 
	prawy(nullptr), 
	rodzic(nullptr)
{ }




void dodawanie__(osoba &n, wezel* parent, wezel* &start) 
{
	
	if (start == nullptr) 
	{
		start = new wezel;
		start->dane = n;
		start->rodzic = parent;
	}
	else
	{
		if(n.dane.plec == "mezczyzna")
		{
			dodawanie__(n, start, start->lewy);
		}
		else if(n.dane.plec == "kobieta")
		{
			dodawanie__(n, start, start->prawy);
		}
	}
}

void dodawanie(osoba &n, wezel* &parent) { dodawanie__(n, parent, parent); }


/* użycie */
wezel * root = nullptr;


osoba dane;
...
 
dodawanie(dane, root);

 

komentarz 2 kwietnia 2017 przez krzakurts Obywatel (1,470 p.)

Skorzystałem z twojego pomysłu i po małych poprawkach się kompiluje, dzięki :) 

 

void wyswietl(wezel *parent, int h)
{

     if(parent!=NULL)
     {
                wyswietl(parent->lewy,h+1);
                for(int i=1;i<h;i++) cout<<" ";
                cout << parent->dane<<endl;
                wyswietl(parent->prawy,h+1);
     }
}

 

Wywala mi błąd w linii z "parent->dane" : error: cannot bind 'std::ostream... 

Próbowałem przeciążyć operator w ten sposób : 

 

ostream& operator << (ostream &wyjscie, wezel const& w)
{

   wyjscie << w.dane << endl;
   return wyjscie;
}

ale wywala mi przy tym też błąd. Wiesz może, co robię źle?

komentarz 2 kwietnia 2017 przez j23 Mędrzec (195,220 p.)

Zrób operator << dla struktury osoba.

Podobne pytania

+1 głos
0 odpowiedzi 238 wizyt
0 głosów
0 odpowiedzi 662 wizyt
pytanie zadane 19 stycznia 2019 w C i C++ przez profsor500 Użytkownik (610 p.)
0 głosów
1 odpowiedź 2,656 wizyt

92,851 zapytań

141,792 odpowiedzi

320,882 komentarzy

62,183 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...