Lista alfabetica comportamento anomalo...

di il
4 risposte

Lista alfabetica comportamento anomalo...

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

4 Risposte

Devi accedere o registrarti per scrivere nel forum
4 risposte