Comunque grazie ancora Nippolo per la pazienza e per avermi dato tutte queste dritte.
Per chi volesse, allego il codice completo e funzionante per lavorare con le liste(con tutte le funzioni base) , semmai servisse a qualcuno.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX 31
//-------------------------------------------------------------------------------------------
//------------------------------------------------STRUTTURE DATI-----------------------------
//-------------------------------------------------------------------------------------------
typedef struct s_persona
{
char cognome[MAX];
char nome[MAX];
struct s_persona *next;
}persona;
//--------------------------------------------------------------------------------------------------
//-------------------------------------------PROTOTIPI FUNZIONI-------------------------------------
//--------------------------------------------------------------------------------------------------
void nuova_persona(persona **head);
void inserisci_persona(persona **head, persona *nuova_persona);
void stampa_lista(persona *head);
persona *cerca_persona(persona *head, char *cognome, char *nome);
persona *cancella_persona(persona *head, persona *persona_cercata);
persona *cancella_lista(persona *head);
//--------------------------------------------------------------------------------------------------
//------------------------------------------------MAIN----------------------------------------------
//--------------------------------------------------------------------------------------------------
int main()
{
//INIZIALIZZO LA LISTA
persona *head=NULL;
char cognome[MAX],nome[MAX];
int i,dim,scelta;
persona *persona_cercata;
do
{
system("CLS");
printf("\n**MENU ESERCIZIO LISTE**\n");
printf("1. Inserisci Persona nella Lista\n");
printf("2. Stampa Lista\n");
printf("3. Cerca Persona nella Lista\n");
printf("4. Cencella Persona dalla Lista\n");
printf("5. Cancella Lista\n");
printf("6. Esci\n\n");
printf("Scegli un'opzione del menù: ");
scanf("%d",&scelta);
switch(scelta)
{
case 1: system("CLS");
printf("\n***INSERIMENTO PERSONA IN LISTA***\n");
printf("\nNumero di persona da inserire in lista:");
scanf("%d",&dim);
for(i=0;i<dim;i++)
{
nuova_persona(&head);
}
scelta=7;
printf("\n");
system("PAUSE");
break;
case 2: system("CLS");
printf("\n*** STAMPA PERSONE IN LISTA***\n");
printf("\n\nCognome\t\tNome\n");
stampa_lista(head);
if(head==NULL)
printf("\nLa lista è vuota.\n");
scelta=7;
printf("\n");
system("PAUSE");
break;
case 3: printf("\n***CERCA PERSONA NELLA LISTA***");
printf("\nInserire i dati della persona da cercare in lista:\n");
printf("\nCognome: ");
fflush(stdin);
gets(cognome);
printf("\nNome: ");
gets(nome);
fflush(stdin);
persona_cercata=cerca_persona(head,cognome,nome);
if(persona_cercata!=NULL)
printf("\nPersona cercata presente nella lista.\n");
else
printf("\nPersona cercata NON presente nella lista.\n");
scelta=7;
system("PAUSE");
break;
case 4: printf("\n***CANCELLA PERSONA DALLA LISTA***\n");
printf("\nInserisci i dati della persona da cancella dalla lista:\n");
fflush(stdin);
printf("\nCognome: ");
gets(cognome);
printf("\nNome: ");
gets(nome);
fflush(stdin);
persona_cercata=cerca_persona(head,cognome,nome);
if(persona_cercata!=NULL)
head=cancella_persona(head,persona_cercata);
else
printf("\nPersona NON presente nella lista.\n");
scelta=7;
system("PAUSE");
break;
case 5: printf("***ELIMINA LISTA***");
head=cancella_lista(head);
assert(head==NULL);
printf("\nLista eliminata con successo..\n");
scelta=7;
system("PAUSE");
break;
default: printf("\nOpzione non presente nel menù...\n");
system("PAUSE");
break;
}
}while(scelta<1 || scelta>6);
}
//--------------------------------------------------------------------------------------------------
//----------------------------------------------DEFINIZIONE FUNZIONI--------------------------------
//--------------------------------------------------------------------------------------------------
void nuova_persona(persona **head)
{
persona *nuova_persona=NULL;
//Allocazione Dinamica della memoria per la variabile "nuova_persona"
nuova_persona=(persona *)malloc(sizeof(persona));
assert(nuova_persona!=NULL);
printf("\n\nInserire i dati dati della nuova persona:\n");
fflush(stdin);
printf("\nCognome: ");
gets(nuova_persona->cognome);
printf("\nNome: ");
gets(nuova_persona->nome);
fflush(stdin);
inserisci_persona(head,nuova_persona);
return;
}
void inserisci_persona(persona **head, persona *nuova_persona)
{
persona *prec = NULL;
persona *corr = *head;
int a;
while(corr && ((a = strcmp(nuova_persona->cognome, corr->cognome)) > 0 ||
(!a && strcmp(nuova_persona->nome, corr->nome) > 0)))
{
prec = corr;
corr = corr->next;
}
if(prec)
{
prec->next = nuova_persona;
}
else
{
*head = nuova_persona;
}
nuova_persona->next = corr;
}
void stampa_lista(persona *head)
{
//NOTA: Posso tranquillamente utilizzare la variabe head, viene modificata solo localmente
while(head!=NULL)
{
printf("%s\t\t%s\n",head->cognome,head->nome);
head=head->next;
}
return;
}
persona *cerca_persona(persona *head, char *cognome, char *nome)
{
int ctrl_1=1,ctrl_2=1;
while(head!=NULL && ((ctrl_1=(strcmp(cognome,head->cognome))>0 || (ctrl_1=(strcmp(cognome,head->cognome))==0 && (ctrl_2=(strcmp(nome,head->nome))>0)))))
{
head=head->next;
}
if(ctrl_1==0 && ctrl_2==0)
return head;
else
return NULL;
}
persona *cancella_persona(persona *head, persona *persona_cercata)
{
persona *corr=persona_cercata;
corr=corr->next;
if(persona_cercata!=NULL)
{
free(persona_cercata);
}
return corr;
}
persona *cancella_lista(persona *head)
{
char ctrl;
persona *corr=head, *succ;
printf("\nSicuro di voler eliminare la lista? (S/N) ");
scanf("\n%c",&ctrl);
if(ctrl=='S'||ctrl=='s')
{
printf("\nEliminazione lista in corso...\n");
while(corr!=NULL)
{
succ=corr->next;
free(corr);
corr=corr->next;
corr=succ;
}
return NULL;
}
else
return corr;
}