Sarebbe meglio effetuare il casting alla malloc() dato che quest'ultima restituisce un puntatore (void*) , per cui nell'allocazione modifica in
q=(nodo*)malloc(sizeof(nodo));
. inoltre modificherei la funzione 'ins_ord' in questo modo:
void ins_ord(nodo* &p,int val) {
if(p==NULL) p=creazione();
else if(val > p->dato) ins_ord(p->ptrdx,val);
else ins_ord(p->ptrsx,q);
}
così si può anche non usare 'ins_bin' in quanto quando andiamo ad inserire il nodo in modo ordinato, il vecchio puntatore, se nullo, viene aggiornato. da aggiornare quindi anche la funzione 'visita':
void visita(nodo *p){
if(p != NULL){
visita(p->ptrsx);
printf("%i\t", p->dato);
visita(p->ptrdx);
}
}
per quanto riguarda 'eliminazione' esso può restituire un valore booleano non valido, dato che nel caso il valore da eliminare non esiste nell'albero, esso ritorna lo stesso 'true', quindi da implementare meglio, come ad esempio:
bool eliminazione(nodo* &p,int val){
nodo *rd,*rs;
if(p==NULL) retrun false;
if(p->dato==val){
rs=p->ptrsx;
rd=p->ptrdx;
delete p;
if(rd == NULL)p=rs;
else{
while(rd->ptrsx != NULL) rd=rd->ptrsx;
rd->ptrsx=rs;
p=rd;
}
return true;
}else if (val>p->dato) return eliminazione(p->ptrdx,val);
else return eliminazione(p->ptrsx,val);
}
a questo punto il main diventa:
//funzione per la dellocazione finale dell'albero, usata alla fine del main
void dealloca(nodo* &p){
if(p!=NULL){
dealloca(p->ptrsx);
dealloca(p->ptrdx);
delete p;
p=NULL;
}
}
int main() {
nodo *radice = NULL;
int scelta, num;
do {
printf("1 - Inserimento ordinato;\n2 - Visita albero;\n3 - Cancella elemento;\n0 - Esci;\n\nScelta:\t");
scanf("%i", &scelta);
switch(scelta) {
case 1: {
ins_ord(radice);
break;
}case 2: {
printf("\nAlbero:\n");
visita(radice);
printf("\n\n");
break;
}
case 3: {
if (radice != NULL){
printf("\nInserisci il numero da cancellare:\t");
scanf("%d", &num);
eliminazione(radice, num);
} else {
printf("\nLa lista e' vuota.\n");
}
break;
}
}
}while(scelta !=0);
printf("\n Uscita in corso...");
dealloca(radice);
prinff("fatto.\n");
system("PAUSE");
return 0;
}
prova con queste modifiche e vedi se funziona.