Albero binario di ricerca

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
andolfiluca
Prode Principiante
Messaggi: 27
Iscrizione: giovedì 12 maggio 2016, 11:12
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS
Sesso: Maschile

Re: Albero binario di ricerca

Messaggio da andolfiluca »

Il fatto è che ci hanno assegnato questo progetto da consegnare tra una settimana e non avendo chissà che basi perché sono al primo anno e non avendo avuto un insegnamento adeguato a mio parere, faccio difficoltà, questo consiglio lo terrò a mente e vedrò di fare qualche esercizio semplice per entrare bene nel meccanismo, di sicuro risposte come le ultime due sono più costruttive e mi aiutano sicuramente, infatti vi ringrazio per l'aiuto e sono su questo forum proprio per questo, ora mi cerco di fare qualche esercizio vedo cosa riesco a fare in una settimana, grazie dei consigli ci risentiremo sicuramente ahahahaha. Bellissima la penultima risposta comunque grazie mille.
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: Albero binario di ricerca

Messaggio da SuperStep »

@ienaplinky hai ragione! non mi ero accorto di dove finisse il for (maledetta identazione, ero convinto che il for fosse solamente questo:)

Codice: Seleziona tutto

for (nodo_p = padre_p = *radice_p;((nodo_p != NULL) && (nodo_p->matricola != matricola));
invece tutto il blocco e' un'unico for

Codice: Seleziona tutto

for (nodo_p = padre_p = *radice_p;((nodo_p != NULL) && (nodo_p->matricola != matricola)); padre_p = nodo_p, nodo_p = (matricola < nodo_p->matricola) ? nodo_p->sx_p : nodo_p->dx_p);
ma questa indentazione mi aveva ingannato:

Codice: Seleziona tutto

for (nodo_p = padre_p = *radice_p;((nodo_p != NULL) && (nodo_p->matricola != matricola));
   
        padre_p = nodo_p, nodo_p = (matricola < nodo_p->matricola)?
   nodo_p->sx_p:
   nodo_p->dx_p);
ad ogni modo, quello che intendevo io per la sintassi

Codice: Seleziona tutto

a = b,b = c;
e' che si esprime semplicemente in

Codice: Seleziona tutto

a = b = c;
per cui:

Codice: Seleziona tutto

padre_p = nodo_p = (matricola < nodo_p->matricola) ? ...
riguardo invece questa dichiarazione
il doppio puntatore serve perchè quando l'albero è vuoto non hai modo di modificare la radice senza ritornare l'albero. Poichè il valore di ritorno è occupato ci vuole per forza.
non sono d'accordo (sara' perche' programmo da troppo ad oggetti).

quello che dici sostanzialmente e':
se posseggo la radice e devo modificarla nella funzione, non posso farlo'.

in realta' basta orientare le funzioni in modo che restituiscano sempre la radice, nel caso in cui devi prendere un elemento, basta creare una struttura del tipo

Codice: Seleziona tutto

typedef struct coppia_nodo_albero_bin_t {
    nodo_albero_bin_t * testa;
    nodo_albero_bin_t * estratto;
} coppia_nodo_albero_bin_t;
e ritornare questa struttura con la testa ed il nodo estratto, per poi prelevarle nelle istruzioni successive.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: Albero binario di ricerca

Messaggio da ienaplinsky »

SuperStep [url=http://forum.ubuntu-it.org/viewtopic.php?p=4883988#p4883988][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: ad ogni modo, quello che intendevo io per la sintassi

Codice: Seleziona tutto

a = b,b = c;
e' che si esprime semplicemente in

Codice: Seleziona tutto

a = b = c;
per cui:

Codice: Seleziona tutto

padre_p = nodo_p = (matricola < nodo_p->matricola) ? ...
Così non è la stessa cosa

Codice: Seleziona tutto

padre_p = nodo_p = (matricola < nodo_p->matricola) ? ...
è di diverso da

Codice: Seleziona tutto

padre_p = nodo_p, nodo_p = (matricola < nodo_p->matricola) ? nodo_p->sx_p : nodo 
nel primo codice stai assegnando lo stesso valore a padre_p e nodo_p nel secondo prima assegni il valore di nodo_p a padre_p e poi sovrascrivi nodo_p

Per il doppio puntatore sono scelte. Lui ha deciso di ritornare un valore invece dell'albero perciò utilizzare un doppio puntatore è l'unico modo per modificare la radice. Se ritorni l'albero ovviamente non serve.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 11 ospiti