Non c'è bisogno di tirare a caso

Direi che ti manca un puntatore all'ultimo elemento creato. Tale puntatore (chiamiamolo pp) deve essere inizializzato a NULL; all'interno del ciclo, dopo aver controllato che pp non sia NULL, valorizzerai pp->next con il nuovo elemento p (ovviamente dopo averlo creato); a questo punto p->prev dovrà essere valorizzato con pp e dopo, soltanto dopo, sempre all'interno del ciclo pp deve essere aggiornato con il valore di p.

Tutto chiaro?

Stefano.