Due possibilità semplici:
1. tieni due liste: una con i dati dei libri (titolo, autore, ...), una con i dati delle copie (numero scaffale, posizione scaffale); nella struct delle copie, però, inserisci anche un puntatore alla struttura contenente i dati del libro corrispondente; questo metodo privilegia la possibilità di risalire in maniera rapida da copia a libro;
2. tieni una lista con i dati dei libri, e ogni struct-libro contiene un puntatore alla lista delle sue copie; ovvero, hai una macro-lista di libri e tante "listine" di copie; questa rappresentazione, al contrario, privilegia la possibilità di trovare facilmente le copie dato un libro.
Ma l'approccio migliore (che consente di passare da libro a lista di copie e viceversa in maniera rapida) può essere un approccio combinato: fai come al punto 2, ma mantenendo nelle struct delle copie un puntatore al libro corrispondente.