Adesso non ho il tempo di esaminare in dettaglio il tuo codice,
se riesco lo faro' piu' avanti; ti fornisco una traccia
su come risolverei il problema al tuo posto (e' un metodo alternativo).
Fra soci e auto esiste una relazione molti a molti, perche'
lo stesso socio puo' avere piu' auto e la stessa auto
(cioe' con stessi marca, modello e anno prod.) puo' essere
posseduta da piu' soci.
Per gestire questo tipo di relazione, si puo' creare
una terza struttura (in aggiunta a soci e auto)
contenente i riferimenti incrociati, cioe' una coppia
di puntatori che identificano ogni coppia esistente
socio-auto.
Esempio: ci sono tre soci Tizio, Caio e Sempronio
e 5 modelli di auto, A, B, C, D, E.
Si presenta Tizio, che dice di possedere le auto B, D, E;
si inserisce Tizio nella lista dei soci, poi nella lista auto
si mettono B, D, E; nella lista dei riferimenti incrociati
si inseriscono tre strutture, con le coppie punta Tizio-punta B,
punta Tizio-punta D, punta Tizio-punta E.
Si presenta Caio, che possiede le auto C, D;
si mette Caio nella lista dei soci e C in quella delle auto
(D no, perche' c'e' gia'); nella lista dei riferimenti incrociati
si memorizzano le coppie p.Caio-p.C, p.Caio-p.D.
Infine arriva Sempronio, che possiede le auto A, B, E;
si mette Sempronio nella lista dei soci e A in quella delle auto
(B, E ci sono gia'); nella lista dei riferimenti incrociati
si inseriscono le coppie p.Sempronio-p.A, p.Sempronio-p.B,
p.Sempronio-p.E.
Alla fine ti ritrovi con le seguenti tre liste:
soci (in ordine alf.): Caio, Sempronio, Tizio;
auto (in ordine di inserimento): B, D, E, C, A;
lista rif. incr. (in ordine di inserimento):
p.Tizio-p.B, p.Tizio-p.D, p.Tizio-p.E,
p.Caio-p.C, p.Caio-p.D,
p.Sempronio-p.A, p.Sempronio-p.B, p.Sempronio-p.E.
Il metodo puo' funzionare anche inserendo prima tutti i soci,
poi - con la funzione Vettura - le auto di ognuno.
La funzione Email dovrebbe fare la scansione di tutta la lista
dei rif. incr. e ogni volta che trova un puntatore all'auto cercata
dovrebbe visualizzare (tramite puntatore) il socio corrispondente,
col suo indirizzo e-mail.
La funzione Vettura dovrebbe fare la scansione della lista dei soci,
fermandosi su quello col CF richiesto, consentire di inserire
nella lista delle auto una nuova auto (se non c'e' ancora)
e inserire nella lista dei rif. incr. la coppia p.Socio-p.Auto.
Si puo' anche prevedere il caso particolare di un socio
che abbia piu' esemplari della stessa auto; in questo caso,
nella coppia p.Socio-p.Auto si dovrebbe mettere un ulteriore campo
che contenga il numero di auto possedute (di quel tipo).
Lascio ai piu' esperti la valutazione della maggiore o minore
efficienza di questa soluzione. La cosa sicura e' che in questo modo
ogni auto viene inserita in lista una sola volta; invece,
con la lista dei soci (ogni nodo della quale punta a una lista
di auto) puo' capitare che la stessa auto compaia piu' volte
in liste diverse; si puo' creare una ridondanza.
Col mio metodo la ricerca dei soci (e dei relativi e-mail)
che hanno una data auto implica la percorrenza di una sola lista,
quella dei rif. incr.; con la lista dei soci, con nodi che puntano
a liste di auto, bisogna percorrere la lista principale e,
per ogni nodo, la lista delle auto. Col mio metodo, pero',
e' un po' piu' complicato l'inserimento dei dati, dovendo
gestire anche la memorizzazione nella lista dei rif. incr.
(che occupa anche memoria).
Vedi tu.
typedef struct rif_incr
{
soci *p_socio;
vettura *p_vettura;
rif_incr *next;
} rif_incr;