Per pima cosa non hai detto che tipo di lista ti serve unidirezionale,
direzionale o circolare. Tralasciamo quella circolare che non credo
propio ti serva. Tra altre due la differenza sta nel fatto che proso
un elemento della lista (che non sia il primo o l'ultimo) con quella
unibirezionale puoi andare solo avanti, all'elemento successivo, mentre
con quella bidirezionale puoi anche tornare al elemento precedente.
Detto questo passiamo all'implementazione.
Per prima cosa definiamo un elemento della lista con una struttura:
typedef struct _list_ele_{
struct _list_ele_ *succ;
struct _list_ele_ *prec;
// altri dati che ti interessa memorizzare negli elementi della lista
// tipo la stringa non il nome del client
char *nome_client;
} ListEle;
Il campo succ è un puntatore all'elemento successivo nella lista, il campo prec al precedente. Se la lista è unidirezionale non c'è il campo prec.
Per seconda cosa è necessario definire una variabile che punti al primo elemento della lista. Stai attento a non perdere il valore di questa variabile altrimenti non potrai più accedere alla lista, la quale resta in memoria. Esempio:
ListEle *head;
Per inserire un nuovo elemento nella lista puoi fare un inserimento in testa.
Se bidirezionale:
void Inserisci(char *nc){
if(head==NULL){
head=malloc(sizeof(ListEle));
head->prec=head->succ=NULL;
head->nome_client=malloc(strlen(nc));
strcpy(head->nome_client, nc);
}else{
ListEle *t=malloc(sizeof(ListEle));
t->prec=NULL;
t->nome_client=malloc(strlen(nc));
strcpy(t->nome_client, nc);
t->succ=head;
head=t;
}
}
Se unidirezionale:
void Inserisci(char *nc){
if(head==NULL){
head=malloc(sizeof(ListEle));
head->succ=NULL;
head->nome_client=malloc(strlen(nc));
strcpy(head->nome_client, nc);
}else{
ListEle *t=malloc(sizeof(ListEle));
t->nome_client=malloc(strlen(nc));
strcpy(t->nome_client, nc);
t->succ=head;
head=t;
}
}
Per cancellare un elemento devi prima cercarlo e se lo trovi toglierlo dalla lista:
Se bidirezionale:
ListEle *Cerca(char *nc){
ListEle *t=head;
while(t && strcmp(t->nome_client, nc)!=0){
t=t->succ;
}
return t;
}
la funzione ritorna il puntatore all'elemento trovato o NULL se non lo trova.
Se unidirezionale:
ListEle *Cerca(char *nc, ListEle **prec){
ListEle *t=head, *prec=head;
while(t && strcmp(t->nome_client, nc)!=0){
*prec=t;
t=t->succ;
}
return t;
}
la funzione ritorna il puntatore all'elemento trovato o NULL se non lo trova e nel parametro prec mette il puntatore all'elemento precedente a quello trovato.
Se la lista è unidirezionale:
void Cancella(ListEle *e, ListEle *ep){
if(e==head){
head=e->succ;
}else{
ep->succ=e->succ;
}
free(e);
}
Se la lista è bidirezionale:
void Cancella(ListEle *e){
if(e==head){
head=e->succ;
}else{
if(e->prec){
e->prec->succ=e->succ;
}
}
free(e);
}
Per cancellare tutta la lista si con liste unidirezionali che bidirezionali:
void Distruggi(){
ListEle *t;
while(head){
t=head->succ;
if(head->nome_client) free(head->nome_client);
free(head);
head=t;
}
}
Spero di esserti stato utile, per non appesantire ulteriormente il codice ho tralasciato il controllo degli errori.