Ho importato e modificato il codice, compila correttamente, però mi da sempre lo stesso errore..
se tipo io inserisco: 2 - 4 - 7
e poi decido di cancellare il 7 per esempio, non da nessun errore;
però quando vado a "visitare" l'albero, l'elemento è ancora nell'albero, quindi non viene cancellato..
e se poi scelgo di cancellare un'altro valore, mi da l'ultimo errore che ho postato sopra, quello di 2 3 righe..
Il main non dovrebbe essere scorretto, in fondo ho preso quello della funzione "ricerca" e l'ho modificato..
L'unico dubbio mi viene nella funzione "elimina", siccome non ho ancora molta familiarità con le funzioni ricorsive..
Riusciresti a darci un occhio, per vedere se in fondo l'errore è in quella funzione?
Grazie mille, posto il codice attuale.. 
codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// #include <malloc.h>
typedef struct nodo{
int dato;
struct nodo *ptrsx;
struct nodo *ptrdx;
}nodo;
nodo* creazione(){
nodo *q;
q = malloc(sizeof(nodo));
printf("\nInserisci un numero intero:\t");
scanf("%i", &q->dato);
printf("\n");
q->ptrsx = NULL;
q->ptrdx = NULL;
return q;
}
void ins_ord(nodo *p,nodo *q) {
nodo *r;
r = p;
if(r->dato > q->dato) {
if(r->ptrsx == NULL) {
r->ptrsx = q;
}else {
ins_ord(r->ptrsx,q);
}
} else {
if(r->ptrdx == NULL) {
r->ptrdx = q;
} else {
ins_ord(r->ptrdx, q);
}
}
}
nodo* ins_bin(nodo *p) {
nodo *q;
q = creazione();
if(p == NULL) {
return q;
} else {
ins_ord(p, q);
}
return p;
}
void visita(nodo *p){
nodo *r;
r = p;
if(r->ptrsx != NULL) {
visita(r->ptrsx);
}
printf("%i", r->dato);
printf("\t");
if(r->ptrdx != NULL) {
visita(r->ptrdx);
}
}
bool eliminazione(nodo *p, int val) {
// if(p->dato == val)
// p->dato = p->ptrsx;
if(p == NULL)
return false;
else {
elimina(p->ptrsx);
return true;
}
}
int elimina(nodo *p) {
int num, risultato;
if(p->ptrsx == NULL) {
num = p->dato;
free(p);
return num;
} else if(p->ptrsx != NULL)
risultato = elimina(p->ptrdx);
return risultato;
}
int main() {
nodo *radice = NULL;
int scelta = 1, num;
radice = NULL;
while(scelta != 0) {
printf("1 - Inserimento ordinato;\n2 - Visita albero;\n3 - Cancella elemento;\n0 - Esci;\n\nScelta:\t");
scanf("%i", &scelta);
switch(scelta) {
case 1: {
radice=ins_bin(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;
}
}
}
}