Per evitare di creare confusione adesso posto tutto il codice e spiego meglio.
codice:
#include <stdio.h>
#include <string.h>
#include <malloc.h>

FILE *p; 

struct alunno {
	char nome[20];
	char cognome[20];
	char titolo[30];
	struct alunno * succ;
};

struct alunno * ins_ord(struct alunno * t, char nome[], char cognome[], char titolo[]){
	struct alunno * tmp = t;
	struct alunno * p;
	p = (struct alunno *) malloc(sizeof(struct alunno));
	
	if( tmp == NULL || (strcmp(cognome, (*tmp).cognome) == -1)){
		strcpy((*p).cognome, cognome);
		strcpy((*p).nome, nome);
		strcpy((*p).titolo, titolo);
		(*p).succ = t;
		return(p);
	}
	else{
		while((*tmp).succ != NULL)
		{
			tmp = (*tmp).succ;
		}
		if(strcmp(cognome, (*tmp).cognome) > 0){
			strcpy((*p).cognome, cognome);
			strcpy((*p).nome, nome);
			strcpy((*p).titolo, titolo);
			(*p).succ = NULL;
			(*tmp).succ = p;
			return(t);
		}
		else{
			tmp = t;
			while(!(strcmp(cognome, (*tmp).cognome) > 0 && strcmp(cognome, (*(*tmp).succ).cognome) < 0))
				tmp = (*tmp).succ;
			strcpy((*p).cognome, cognome);
			strcpy((*p).nome, nome);
			strcpy((*p).titolo, titolo);
			(*p).succ = (*tmp).succ;
			(*tmp).succ = p;
			return(t);
		}
	}
}

void salva_file(struct alunno *t){
	p = fopen("file.txt", "w");
	while(t != NULL){
		fprintf(p, "%s ", (*t).cognome);
		fprintf(p, "%s \n", (*t).nome);
		fprintf(p, "%s \n", (*t).titolo);
		puts((*t).cognome);
		t = (*t).succ;
	}
	puts("\nDati salvati\n");
	fclose(p);
}

struct alunno * cancella(struct alunno * t){
	char cognome[20];
	struct alunno* p = t;
	struct alunno* testa = t;
	puts("cognome di chi cancellare:");
	fflush(stdin);
	gets(cognome);
	fflush(stdin);
	t = (*t).succ;
	while(t != NULL){
		if(strcmp((*t).cognome, cognome) == 0){
			(*p).succ = (*t).succ;
		}
		p = (*p).succ;
		t = (*t).succ;
	}
	return(testa);
}

struct alunno* carica(){
	struct alunno * t;
	p = fopen("file.txt", "r");
	int c = 1;
	char nome[20];
	char cognome[20];
	char titolo[30];
	while (!feof(p))
	{
		if(c == 1)
		{
			fscanf(p, "%s", nome);
			c++;
		}
		if(c == 2)
		{
			fscanf(p, "%s", cognome);
			c++;
		}
		if(c == 3)
		{
			fscanf(p, "%s", titolo);
			t = ins_ord(t, nome, cognome, titolo);
			c = 1;
		}
	}
	return(t);
}

void main()
{
	int scelta = 9;
	struct alunno* testa = NULL;
	char nome [20];
	char cognome [20];
	char titolo[30];

	while(scelta > 0)
	{
		puts("1) Carica dati da file\n2) Salva dati su file\n3) Inserisci nuovo prestito\n4) Cancella prestito\n0) Esci\n\n");
		scanf("%d", &scelta);

		if(scelta == 1)
		{
			testa = carica();
		}

		if(scelta == 2)
		{
			salva_file(testa);
		}

		if(scelta == 3)
		{
			puts("Inserisci il nome");
			fflush(stdin);
			gets(nome);
			puts("Inserisci il cognome");
			fflush(stdin);
			gets(cognome);
			puts("Inserisci il titolo");
			fflush(stdin);
			gets(titolo);
			testa = ins_ord(testa, nome, cognome, titolo);
		}

		if(scelta == 4)
		{
			testa = cancella(testa);
		}
	}
}
Questo è tutto il codice, ho una lista e devo prevedere il salvataggio e il caricamento della stessa su/da file.
Praticamente io ho già creato la funzione di salvataggio e funziona (è abbastanza semplice in fondo), ma non ho idea di come fare il caricamento, perché sul file gli elementi si presentano in questo modo:
Nome Cognome Libro
Nome1 Cognome1 Libro1
Nome2 Cognome2 Libro2
ecc..

E non so come fare perché fossero tutti la stessa cosa metterei uno fscanf fino alla fine del file e salverei da qualche parte ogni volta che si ripete il ciclo, mentre io dovrei fare che la prima volta prende il nome, la seconda il cognome e la terza il libro e così a ripetersi fino alla fine del file.
Il codice che ho scritto io non funziona.