"...alguien me puede decir ¿por que?..."
 
Porque aux1 no está definido, y como no lo inicializaste a nulo no tienes forma de hacer ninguna comprovacion de error. Cuando entras 2 y 1 se cumple que if(q->dato < aux->dato), pero ahi no asignas nada a aux1, sino que solo asignas aux1 en el siguiente else pero que en este caso no entras:  
Código:
 if(p==NULL){
		p=q;
	}
	else {//en la segunda llamada entras aqui
		aux = (struct nodo*)p;
		if(q->dato < aux->dato) {//se cumple esto
			q->siguiente=aux;
			p=q;              
		}
		else {//y no se ejecuta esto
			aux=(struct nodo*)p;
			while(aux->dato<q->dato&&aux->siguiente!=NULL) {
				aux1=aux;//por lo tanto no asignas nada a aux1
				aux=aux->siguiente;
			}
		}
		
		if(aux->siguiente == NULL && aux->dato < q->dato) {
			aux->siguiente = q;                                       
		}
		else {//aqui aux1 contiene datos basura
			aux1->siguiente = q;
			q->siguiente = aux;
		}
	}
  Saludos
vosk