scusa ma non ho capito perchè c'è tutto quel codice, è alquanto confusionario :P io fossi in te lo riscriverei da capo :P
devi fare questi punti:
- prendi l'elemento in input da inserire;
- controlli il caso che la lista sia vuota;
codice:
if(p == NULL){
            p = malloc(1*sizeof(struct elemento));
            p->info = x;
            p->next = NULL;
- controlli che il primo elemento non sia maggiore dell'elemento in input;
codice:
if(p->info > x){
                p = malloc(1*sizeof(struct elemento));
                p->info = x;
                p->next = q;
- iteri tutto il resto della lista inserendo dove opportuno;
codice:
while((q != NULL) && (q->info < x))
                {
                    prec = q;
                    q = q->next;
                }
questi sono solo spezzoni ovviamente...