Newsgroup: it.comp.lang.c
Titolo: Aiuto! Albero binario di ricerca

Ciao a tutti, mi sto scervellando su un programma che, dato un albero
binario di ricerca (di interi), deve cancellare tutti i nodi dispari e
ricollegare tutto il resto all'albero rimanente.
Premetto che sono un principiante col C, specialmente con gli alberi,
quindi vi prego di non giudicare il mio lavoro, che sicuramente sarà
uno tra i peggiori possibili per implementare il programma.
Il programma sembra "funzionare" solo in casi banali, ovvero quando il
nodo da cancellare non ha figli (è un nodo foglia).
Il programma è il seguente:
#include <stdio.h>
#include <stdlib.h>
typedef struct btree_tag{
        int value;
        struct btree_tag *l, *r;
        }btree;
void ricollega (btree*tmpl, btree*tmpr){
     while(tmpr)
       tmpr=tmpr->l;
     if(tmpl){
 
tmpr=(btree*)malloc(sizeof(btree));
       tmpr->value=tmpl->value;
       tmpr->l=NULL;
       tmpr->r=NULL;
       ricollega(tmpl->l, NULL);
       ricollega(tmpl->r, NULL);
     }
}
void elimina_nodo(btree*btp){
     btree*tmpl, *tmpr;
     tmpl=btp->l;
     tmpr=btp->r;
     free(btp);
     ricollega(tmpl, tmpr);
}
void elimina_dispari(btree*btp){
     if(btp){
       if((btp->value%2)!=0)
          elimina_nodo(btp);
       elimina_dispari(btp->l);
       elimina_dispari(btp->r);
     }
}
void inserisci(btree **btpp) {
  int val;
  printf("\nInserire il valore del nuovo nodo: ");
  scanf("%d", &val);
  while (*btpp!=NULL){
     if ((*btpp)->value == val){
        printf("\nValore gia' inserito!");
        return;
        }
     else {
          if ((*btpp)->value < val)
               btpp=&((*btpp)->r);
          else btpp=&((*btpp)->l);
          }
     }
     *btpp=(btree*)malloc(sizeof(btree));
     (*btpp)->value=val;
     (*btpp)->l=NULL;
     (*btpp)->r=NULL;
  }
void visita_anticipata(btree*btp){
  if(btp){
    printf("%d ", btp->value);
    visita_anticipata(btp->l);
    visita_anticipata(btp->r);
  }
}
int main(int argc, char *argv[])
{
  int t, i;
  btree*tmp,*btp;
  btp=(btree*)malloc(sizeof(btree));
  printf("\nInserire il nodo radice dell'albero binario di ricerca:
");
  scanf("%d", &btp->value);
  btp->l=NULL;
  btp->r=NULL;
  printf("\nSi vuole proseguire nell'inserimento?(s=1/n=0): ");
  scanf("%d", &i);
  tmp=btp;
  while (i==1){
        inserisci(&btp);
        tmp=btp;
        printf("\nSi vuole proseguire nell'inserimento?(s=1/n=0): ");
        scanf("%d", &i);
  }
  elimina_dispari(btp);
  printf("\n\nL'albero visitato in ordine anticipato e' il seguente:
\n");
  visita_anticipata(btp);
  printf("\n\n");
  free(btp);
  system("PAUSE");
  return 0;
}
Si può modificare aggiungendo/togliendo qualcosa senza dover
ricominciare tutto da capo?
Altra domanda per cui ho scritto "funzionare" tra virgolette: perchè
quando vado a stampare l'albero modificato, al posto dei nodi
cancellati viene stampato un numero? La free non mette NULL al posto
di questi??
Grazie per l'attenzione, uno studente.

 tmpr=(btree*)malloc(sizeof(btree));
Il puntatore a cui allochi la memoria non viene poi utilizzato in nessun 
modo, quindi il codice che segue (in questa funzione) č inutile.
Probabilmente devi utilizzare un puntatore a puntatore se vuoi 
modificare il puntatore al nodo piů a sinistra di tmpr.
E.