Salve raga ho creato una lista a puntatori che inserisce un nodo in ordine alfabetico ma non capisco come mai ma il mio compilatore si comporta in modo stranissimo quando eseguo il sorgente in pratica esegue le printf che servono per vedere la scelta da fare poi la seconda volta non mi fa più eseguire la scelta o se la fa eseguire non viene visualizzata come dico io
questo è il sorgente:
#include <stdio.h>
#include <stdlib.h>
struct nodo{
char info;
struct nodo*next;
};
struct nodo *inserisci(struct nodo *lista,char dato);
struct nodo*creanodo(char dato);
struct nodo* inizializza(struct nodo*inizio);
void stampa(struct nodo *inizio);
int carattere_valido(char dato);
char diventa_minuscolo(char dato);
int main(int argc, const char * argv[])
{
struct nodo *inizio=NULL;
int scelta=0;
char lettera;
inizio=inizializza(inizio);
do{
printf("1:inserisci\n");
printf("2:stampa\n");
printf("3:esci\n");
printf("scelta = ");
scanf("%d",& scelta);
switch(scelta)
{
case 1:
printf("inserisci una lettera dell'alfabeto\n");
scanf("%c ",&lettera);
inizio=inserisci(inizio,lettera);
break;
case 2:
stampa(inizio);
break;
case 3:
printf("arrivederci\n");
exit(1);
break;
}
}while(scelta!=3);
return 0;
}
struct nodo *inizializza(struct nodo *inizio)
{
inizio=(struct nodo*)malloc(sizeof(struct nodo));
inizio->next=NULL;
inizio->info='0';
return inizio;
}
struct nodo *creanodo(char dato)
{
struct nodo *app;
app=(struct nodo*)malloc(sizeof(struct nodo));
app->info=dato;
app->next=NULL;
return app;
}
void stampa(struct nodo *inizio)
{
struct nodo *copia;
copia=inizio;
while(copia->next!=NULL)
{
printf("%c",copia->info);
copia=copia->next;
}
}
struct nodo *inserisci(struct nodo *inizio,char dato)
{
struct nodo *app;
struct nodo *copia,*succ;
int validita;// controllo se il carattere da inserire è un carattere dell'alfabeto;
validita=carattere_valido(dato);// 1 carattere valido e minuscolo ascii del carattere decimale se è maiuscolo 0 altrimenti
if(validita==0)
return inizio;
if(validita!=1)
dato=validita;// dato ora contiene il carattere minuscolo
app=creanodo(dato);
copia=inizio;
// arrivati qui vuol dire che il carattere è valido ora bisogna capire dove inserire
if(copia->next==NULL)
{
copia=app;
return copia;
}
//else
while((copia->info>=dato)&&(copia->next!=NULL))
copia=copia->next;// ricerca ingenua;
// controllo se è finita la lista se è così aggiungo il nodo e restituisco
if(copia->next==NULL)
{
copia->next=app;
return copia;
}
// else
// se sono arrivato qui è diventato falso la prima parte del while e devo aggiungere
succ=copia;
succ=succ->next;
copia->next=app;
app->next=succ;
return copia;
}
int carattere_valido(char dato)
{
if((dato>='a')&&(dato<='z'))
return 1;
if((dato>='A')&&(dato<='Z'))
dato=diventa_minuscolo(dato);
return dato;
// else
return 0;
}
char diventa_minuscolo(char dato)
{
dato=dato+' ';
return dato;
}
e questo è l'output:
1:inserisci
2:stampa
3:esci
scelta = 1
inserisci una lettera dell'alfabeto
e
1:inserisci
2:stampa
3:esci
scelta = inserisci una lettera dell'alfabeto
1// valore che ho inserito io
1:inserisci
2:stampa
3:esci
scelta = inserisci una lettera dell'alfabeto
1// valore che ho inserito io
1:inserisci
2:stampa
3:esci
scelta = inserisci una lettera dell'alfabeto
1 // valore che ho inserito io per la terza volta
1:inserisci
2:stampa
3:esci
scelta = inserisci una lettera dell'alfabeto