Questo esercizio e' sulle linked list. Una linked list e' una lista i cui elementi si linkano fra loro. Questo ti permette di avere una struttura molto piu efficiente di un banale array, visto che gli elementi per se posson esser locali ovunque in memoria e gli inserimenti/rimozioni son relativamente semplici (si tratta di cambiar un puntatore). Puoi trovar single o double linked lists. Nel tuo caso hai una single, ovvero un elemento punta all'elemento a lui successivo, ma non al precedente (struct elem *next).
Affinche' la linked lista sia integra, devi mantenere constantemente un puntatore al suo primo elemento. Nel codice si chiama appunto primo.
Quando viene inserito un nuovo elemento viene dapprima allocata la memoria per la struttura (malloc). I suoi elementi sono inizializzati. Dopodiche' avviene la magia: i puntatori a primo e nuovo vengon mossi in modo da inserire il nuovo elemente nella posizione corretta. Nota che l'ultimo elemento della lista avra' il puntatore a next = NULL. Questo ti permette di iterare la lista senza accedere ad aree di memoria che non ti appartengono.
Come esercizio potresti trasformarla in una double linked list, aggiungendo un puntatore a prev (che nella testa della coda punta a NULL).