Non so se sia , una soluzione valida , ma te la propongo .
Num di scaffale e posizione nello scaffale , sono due informazioni , ora ti serve avere queste informazioni per ogni copia , si potrebbe utilizzare un array di strutture come campo della lista , allocato dinamicamente in base al numero copie .

ESEMPIO.

codice:
typedef struct
{
    short int num_scafale;
    short int posizione;
}copia;    
struct nodo
{
    char titolo[40];
    char autore[40];
    char data_pubblicazione[10];
    short int numero_copie;
    copia *c;
    struct nodo *next;  
    
    
};    

typedef struct nodo Lista;



Lista* inizializza(Lista *x)
{
    
    int i;
    fflush(stdin);
    printf("inserisci il titolo:");
    gets(x->titolo);
    puts(x->titolo);
    printf("\n");
    printf("inserisci autore:");
    gets(x->autore);
    printf("\n");
    printf("inserisci data di pubblicazione: ");
    gets(x->data_pubblicazione);
    printf("\n");
    printf("inserisci numero copie :");
    scanf("%d",&x->numero_copie);
    i=x->numero_copie;
    x->c=(copia*)malloc(sizeof(copia)*i);//creo un array di n elementi = a copie 
    for(i=0;i<x->numero_copie;i++)//inizializzo l'array
    {
         printf("inserisci scafale copia %d :",i+1);
         scanf("%d", &x->c[i].num_scafale);
         printf("\n");
         printf("inserisci posizione copia %d :",i+1);
         scanf("%d",&x->c[i].posizione);
    }
    
    
    
    return x;
    
    
    
    
    }