Ciao Clavulcar, ti consiglio innanzitutto di postare meglio il codice la prossima volta perché così non si capisce nulla (oltre al fatto che il regolamento prevede che il codice vada scritto utilizzando i tag appositi).
Te lo riposto io così cerchiamo di capirci qualcosa meglio:
codice:
#include <stdio.h>
#include <stdlib.h>
struct list{
int dato;
struct list*next;
};
int main(void)
{
int i,n;
struct list primo;
primo.next = NULL;
struct list* tmp;
*tmp = primo;
scanf(" %d ", &n);
for ( i = 0; i < n-1; i++ ) {
printf(" %d ", i);
tmp -> next = (struct list*) malloc( sizeof(struct list) );
tmp = tmp -> next;
}
tmp -> next = NULL;
*tmp = primo;
while ( tmp -> next != NULL ) {
scanf(" %d ", &(tmp->dato));
tmp = tmp -> next;
}
*tmp = primo;
while( tmp -> next != NULL)
printf(" %d ", tmp->dato);
return 0;
}
un po' meglio, non ti pare? 
Comunque nel tuo codice ci sono essenzialmente due problemi. Innanzitutto, il segmentation fault lo hai su questa riga:
l'istruzione di per sé sarebbe lecita, ma il punto è che tu stai cercando di assegnare al valore puntato da tmp la struct primo senza aver allocato lo spazio per tmp. Devi quindi correggere così:
codice:
tmp = (struct list *) malloc( sizeof(struct list) );
*tmp = primo;
inoltre devi togliere quegli spazi nelle stringhe di formato delle scanf() altrimenti sarai costretto a immettere due valori di cui però solo il primo viene assegnato alla variabile.
Quindi la prima scanf(), ad esempio, diventa