in dettaglio mi fermo molto presto ...

premessa: ho ipotizzato di creare una sorta di raccolta di libri.
sono riuscito a "svolgere" solo il primo punto (creare una nuova struttura) con scarsissimi risultati.

il secondo punto non capisco cosa voglia dire (non capisco cosa voglia intendere con "elemento" e poi la traccia non mi sembra poi così chiara). stesso discorso per il terzo

tornando al primo punto:
A parte il fatto che ci saranno sicuramente errori "sintattici", mi blocco proprio a livello logico quando devo aggiungere il nodo appena creato alla fine della mia lista... come faccio a "ricordare" dove finisce la mia lista? il passaggio su cui mi blocco è comunque segnalato nel codice allegato "struct_library.c"

ecco cosa ho combinato finora: (il main è abbastanza banale, pressoché inutile leggerlo ma lo allego ugualmente)

main.c
codice:
#include <stdio.h>
#include <stdlib.h>

#include "struct_library.h"

int main()
{
    char key;

    printf("\n\t- Benvenuto. Questo e' il menu:\n\n");

    do
    {
        printf(" 1 - Crea una nuova struttura.\n");
        printf(" 2 - Inserisci un nuovo elemento nella struttura.\n"); //???
        printf(" 3 - Estrai un elemento della struttura.\n"); //???
        printf(" 4 - Visualizza gli elementi della struttura.\n");
        printf(" 5 - Salva il database su un nuovo file.\n");
        printf(" 6 - Carica il database da un file.\n");
        printf(" ... o premi 'Q' per uscire.\n");

        printf("\n Inserisci il tuo comando: ");
        fscanf(stdin, "%c%*c", &key); //mi prende il \0 !!!
        fflush(stdin);

        switch (key)
        {
        case '1':
            nuovolib();
            break;
        case '2':
            //  insert();
            break;
        case '3':
            //  extract();
            break;
        case '4':
            //  view();
            break;
        case '5':
            //  save();
            break;
        case '6':
            //  load();
            break;
        case 'q':case'Q': break;
        default:
            printf("\n\t!!! COMANDO ERRATO, RIPROVA !!!\n");
        }
    }
    while (key != 'Q' && key != 'q');

    printf("\nHai chiuso la sessione. A presto!\n");

    return (EXIT_SUCCESS);
}

struct_library.h
codice:
 
typedef struct rec *lpointer;

typedef struct rec {
    char titolo[50];
    float prezzo;
    lpointer next;
} libro;

void aggiungi(lpointer pn);
void nuovolib();
void inserisci(lpointer* pins, lpointer pnodo);
struct_library.c
codice:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "struct_library.h"

void nuovolib()
{
    lpointer nuovo;
    nuovo = (lpointer) malloc(sizeof (libro));

    printf("\nInserimento di un libro");
    printf("\nTitolo : ");
    fgets(nuovo->titolo, 100, stdin);
    printf("Prezzo : ");
    scanf("%f", &nuovo->prezzo);
    aggiungi(nuovo);
    return;
}

void aggiungi(lpointer pn)
{
    lpointer *posins; 
    
   // funzione tale che posins=ultimo.next   
    
    inserisci(posins, pn);
}

void inserisci(lpointer* pins, lpointer pnodo)
{
    *pins = pnodo;
}
in attesa che si accenda una lampadina :P

EDIT: ah e dimenticavo... non ho la più pallida idea di come separare le funzioni in due moduli distinti... ma quello (per ora) non è così grave...