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

Drzewo binarne

Object Storage Arubacloud
0 głosów
353 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 (155,460 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 (194,920 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 (194,920 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 (194,920 p.)

Zrób operator << dla struktury osoba.

Podobne pytania

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

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...