Ciao a tutti. Ho realizzato un programma che inserirsce in una lista un elemento intero alla volta e lo inserisce rispettando l'ordine crescente dei numeri naturali.

La funzione ordina() grosso modo funziona. L'unico problema è che se l'elemento da inserire è più piccolo di tutti gli elementi presenti in lista, (quindi va inserito in testa), l'inserimento fallisce. Il programma non va in crash ma ignora proprio l'elemento e non lo inserisce.

Grazie a tutti. Ecco il codice:

codice:
struct elemento *aggiungi_ordinato(struct elemento *p){

    struct elemento *q;
    struct elemento *nuovo = NULL;
    struct elemento *prec = NULL;
    int i, x;

        system("cls");
        if(p==NULL){        // se la lista e' vuota diventa primo elemento
            p = malloc(1*sizeof(struct elemento));
            printf("\n\tInserisci informazione: \t");
            scanf("%d", &p->info);
            p->next = NULL;
        }
            else{               // se la lista ha altri elementi
                    q = p;
                    printf("\n\tInserisci informazione: \t");
                    scanf("%d", &x);
                        while((q!=NULL) && (x > q->info)){
                            prec = q;
                            q = q->next;
                        }

                    nuovo = malloc(1*sizeof(struct elemento));
                    nuovo->info = x;

                        if(q==NULL){    // siamo a fine lista
                            prec->next = nuovo;
                            nuovo->next = NULL;
                        }
                            if(prec==NULL){    //siamo a inizio lista - NON FUNZIONA E NON SI CAPISCE PERCHE' -
                                    nuovo->next = q;
                                    q = nuovo;
                                }
                                    else{       // siamo in un punto qualsiasi
                                        prec->next = nuovo;
                                        nuovo->next = q;
                                    }
            }
            return(p);
}