Con un amico sono arrivato a questo codice:
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){
if(p != NULL){
visita(p->ptrsx);
printf("%i\t", p->dato);
visita(p->ptrdx);
}
}
bool eliminazione(nodo *p,int val){
nodo *rd,*rs;
if(p==NULL) return false;
if(p->dato==val){
rs=p->ptrsx;
rd=p->ptrdx;
free(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);
}
//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);
free(p);
p=NULL;
}
}
int main()
{
nodo *radice = NULL;
int scelta = 1, num;
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);
radice->ptrsx=NULL;
radice->ptrdx=NULL;
eliminazione(radice, num);
} else {
printf("\nLa lista e' vuota.\n");
}
break;
}
}
}
}
Però qualsiasi numero io voglia cancellare (sia che esista, e sia che non esista), mi elimina sempre la radice, ovvero il primo valore che inserisco nell'albero..
Come mai?