Newsgroup: it.comp.lang.c
Titolo: alberi

Salve ragazzi,una domandina facile:per gestire un albero binario di ricerca
su ogni elemento ho bisogno del puntatore padre o me la cavo con i soli
figlio sx e figlio dx,devo eseguire le solite operazioni di
inserimento,cancellazioni ,ricerca etc + un'operazione che mi trova elementi
adiacenti secondo un certo ordinamento,perň gli elementi adiacenti non
necesseariamente sono vicini nell'albero.
Non so se mi sono spiegato , spero di sě.Grazie 1000 per l'aiuto

Scusate ma aggiungo una cosa:a che servono gli operatori   ?   e  :,fanno
parte dell'ansi c o no? Grazie


In effetti, visto che chiedi aiuto, potevi cercare di spiegarti un pň
meglio ;^). Comunque, se ho capito bene, per quanto riguarda ricerca,
inserimento e cancellazione basta conoscere i puntatori sx e dx di ogni
nodo padre, perchč sono operazioni "in avanti", cioč non richiedono di
dover percorrere a ritroso la struttura. Per quanto riguarda l'altra
operazione a cui accenni, visto che dici che i nodi possono essere non
adiacenti, potrebbe essere necessario "ritornare indietro",  ed in tal
caso č utile avere in ogni nodo anche un puntatore al nodo padre (ma puň
non essere indispensabile). 
Cecco


In effetti, visto che chiedi aiuto, potevi cercare di spiegarti un pň


 parte dell'ansi c o no? Grazie
L'operatore ?: (č ternario) si usa cosě:
a ? b:c
dove a č una espressione logica, e b e c sono espressioni che vengono
eseguite a seconda del risultato della valutazione di a. Una
applicazione pratica di tale operatore č dato dalle macro. Ad esempio:
#define switch(a,b) (a<b ? a:b)
se metti questa riga all'inizio di un codice, puoi usare la macro
switch(a,b) con qualunque tipo di variabili a e b, purchč compatibili
con l'operatore "<": se ad esempio a e b sono int, switch(a,b)
restituisce a se a<b, restituisce b se a>=b.
Ciao, 
Cecco
Cecco

#define switch(a,b) (a<b ? a:b)
Per l'ennesima volta:
#define switch(a,b) ((a)<(b) ? (a):(b))
-- 
Andrea Laforgia - walkietalkie(at)
libero.it

 #define switch(a,b) ((a)<(b) ? (a):(b))
Very sorry :)
Cecco

Grazie 1000

Perchč?

 Perchč?
per la precedenza degli operatori

 Perchč?
Le macro non sono come le funzioni, ma vengono espanse in base al codice
scritto nella macro stessa ogni volta che vengono richiamate.
Ad esempio, riprendendo lo switch(a, b), se a, b, c, d e x sono int:
x = switch(a+b, c+d)
se switch(a, b) fosse stata scritta come ha suggerito Andrea,
l'espansione sarebbe stata:
x = ((a+b)<(c+d) ? (a+b):(c+d));
mentre se fosse stata scritta come io (erroneamente) ho fatto
nell'esempio:
x = (a+b<c+d ? a+b : c+d);
che avrebbe causato un comportamento non voluto, perchč in pratica
equivale a:
x = (a+(b<c)+d ? (a+b) : (c+d));
Ciao,
Cecco

Devo mettere a zero un campo di un elemento,il campo visitato di una
struct,di tutti i nodi di un albero binario,va bene una cosa cosě:
pulisci_visitati(testa);
testa->visitato = 0;
void pulisci_visitati(PEDINA *chiave)
{
  if (chiave->figlio_sx != NULL)
  {
   pulisci_visitati(chiave->figlio_sx);
 chiave->visitato=0;
  }
 if (chiave->figlio_dx != NULL)
  {
   pulisci_visitati(chiave->figlio_dx);
   chiave->visitato = 0;
  }
 return;
}
Dovrebbe funzionare no?Grazie 1000