A me sembra funzionare. Facendo un paio di correzioni ad altre parti del codice.
Ad ogni modo c'è un'assegnazione all'interno di un if l'ho segnalata, ma è un problema.
main.c
#include <stdio.h>
#include <stdlib.h>
#include "abr.h"
int main() {
int esci=0, scelta=11, continua;
ABR albero=NULL;
char *stringa, *stringa1, *stringa2;
char risp;
int x;
while(!esci) {
switch(scelta) {
case 1:
printf("Inserisci stringa: ");
stringa=leggi();
albero=abr_insert(albero,stringa);
printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
scanf("%d",&continua);
if (continua==1) scelta=11;
else esci=1;
break;
case 2:
if(albero!=NULL) abr_stampa(albero);
else printf("Abr vuoto.\n");
printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
scanf("%d",&continua);
if (continua==1) scelta=11;
else esci=1;
break;
case 3:
if (albero!=NULL) {
albero=abr_svuota(albero);
printf("Abr svuotato.\n");
} else printf("Abr gia' vuoto.\n");
printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
scanf("%d",&continua);
if (continua==1) scelta=11;
else esci=1;
break;
case 4:
if (albero==NULL) printf("Abr vuoto.");
else {
printf("Quale stringa vuoi cancellare? ");
stringa=leggi();
albero=abr_cancel(albero,stringa);
}
printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
scanf("%d",&continua);
if (continua==1) scelta=11;
else esci=1;
break;
case 5:
printf("\nInserisci due strighe entro le quali vuoi sia compreso il valore di quella\nda eliminare (in ordine crescente):\n1) ");
stringa1=leggi();
printf("2) ");
stringa2=leggi();
printf("Se vuoi eliminare una stringa di lunghezza pari, digita un numero pari, \naltrimenti digita un numero dispari: ");
scanf("%d", &x);
printf("Sono state eliminate, perche' rispecchiano i criteri scelti, le stringhe: ");
// albero=abr_cancellaparidispari(albero,x,stringa1,stringa2);
printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.");
scanf("%d",&continua);
if (continua==1) scelta=10;
else esci=1;
break;
case 9:
esci=1;
break;
case 11:
printf("\n\t\t**************** MENU ****************\n\n");
printf("1) Aggiungi una stringa all'abr.\n");
printf("2) Stampa contenuto abr.\n");
printf("3) Svuota abr.\n");
printf("4) Cancella un nodo dall'abr.\n");
printf("5) Cancella una stringa con lunghezza pari o dispari, e con valore \n compreso tra due stringhe scelte.\n");
printf("9) Esci. \n\n\n");
printf("\nInserisci la tua scelta: ");
scanf("%d%*c",&scelta);
break;
/*case :
printf("Scelta non valida");
scelta=11;
break;*/
}
}
printf("\nBye!\n");
system("PAUSE");
return 0;
}
abr.h
#ifndef RB_H_INCLUDED
#define RB_H_INCLUDED
typedef struct abr * ABR;
char * leggi (void);
ABR abr_insert(ABR t, char *elem);
void abr_stampa(ABR t);
ABR abr_svuota(ABR t);
ABR abr_cancel(ABR t, char *elem);
ABR abr_staccamin(ABR p_t, ABR t);
#endif // RB_H_INCLUDED
abr.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "abr.h"
typedef struct abr {
char *str;
struct abr *sx;
struct abr *dx;
} abr;
char * leggi (void) {
char *s = (char *)malloc(80*sizeof(char));
scanf ("%s",s);
return s;
}
/*
ABR abr_insert(ABR t, char *elem) {
if (t!=NULL) {
if (strlen(elem)<=strlen(t->str))
t->sx=abr_insert(t->sx,elem);
else t->dx=abr_insert(t->dx,elem);
return t;
}
else {
ABR nodo=(abr *)malloc(sizeof(abr));
nodo->str=elem;
nodo->sx=NULL;
nodo->dx=NULL;
return nodo;
}
}
*/
ABR abr_insert(ABR t, char *elem) {
if (t!=NULL) {
if (strcmp(elem,t->str)<0)
t->sx=abr_insert(t->sx,elem);
else if (strcmp(elem,t->str)>0)
t->dx=abr_insert(t->dx,elem);
return t;
}
else {
ABR nodo=(abr *)malloc(sizeof(abr));
nodo->str=elem;
nodo->sx=NULL;
nodo->dx=NULL;
return nodo;
}
}
void abr_stampa(ABR t) {
if (t!=NULL) {
if (t->sx!=NULL) abr_stampa(t->sx);
printf("%s\n",t->str);
if(t->dx!=NULL) abr_stampa(t->dx);
}
else return;
}
ABR abr_svuota (ABR t) {
if(t!=NULL) {
if(t->dx!=NULL)
t->dx=abr_svuota(t->dx);
else if(t->sx!=NULL)
t->sx=abr_svuota(t->sx);
}
return t;
}
ABR abr_cancel(ABR t, char *elem) {
if (t!=NULL) {
if ((strlen(elem))<(strlen(t->str))) t->sx=abr_cancel(t->sx,elem);
else if ((strlen(elem))>(strlen(t->str))) t->dx=abr_cancel(t->dx,elem);
else if ((strcmp(elem,t->str)) == 0 ) {
ABR tmp=(abr *)malloc(sizeof(abr));
tmp=t;
if(tmp->sx == NULL) t=tmp->dx;
else if (tmp->dx == NULL) t=tmp->sx;
else {
tmp=abr_staccamin(t,t->dx);
strcpy(t->str,tmp->str);
}
free(tmp);
}
}
return t;
}
ABR abr_staccamin(ABR p, ABR t) {
if (t!=NULL) {
if (t->sx!=NULL)
return abr_staccamin(t,t->sx);
else {
if (t=p->sx) // Qui hai un'assegnazione sarà vera sempre
p->sx=t->dx;
else
p->dx=t->dx;
}
}
return t;
}
P.s.
Ho messo sul pc e verificato molto velocemente il codice con le stringhe pippo, pippa e ripetendo la scrittura di pippo che non mi carica nell'albero come volevi tu.
ATTENTA ai warning!