codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define FILE_NAME "lista.txt"
#define TRUE 1
#define FALSE 0
#define SIZE 32
#define CORSO 10
#define MESE 12
//struttura che descrive l'allievo
struct strut_persona {
char nome[SIZE];
char cognome[SIZE];
char indirizzo[SIZE];
char corso[CORSO];
char numtel[CORSO];
char mese[MESE];
char anno[4];
};
//struttura base della lista
struct lista {
struct strut_persona persona;
struct lista * next;
};
typedef struct lista * lista_ptr;
FILE * file;
//dichiarazioni di funzioni
int menu();
int inserisci_persona( lista_ptr * );
int elimina_persona( lista_ptr * );
int cerca( const lista_ptr );
lista_ptr cerca_ric ( const lista_ptr , char *, char *);
int salva ( const lista_ptr );
int carica( lista_ptr * );
void stampa( const struct lista * );
void visualizza(const lista_ptr);
//int cerca_corso ( const lista_ptr, char *);
int main() {
lista_ptr pila =NULL;
int scelta;
carica(&pila);
while(1) {
scelta = menu();
switch(scelta) {
case 1:
inserisci_persona(&pila);
fflush(stdin);
getchar();
break;
case 2:
elimina_persona( &pila);
fflush(stdin);
getchar();
break;
case 3:
cerca( pila);
fflush(stdin);
getchar();
break;
case 4:
stampa( pila);
fflush(stdin);
getchar();
break;
/*case 5:
cerca_corso(pila);
fflush(stdin);
getchar();
break; */
case 6:
exit(0);
default :
printf("Scelta errata!!!\n\n");
fflush(stdin);
getchar();
break;
}
}
return 0;
}
//legge la lista gia salvata precedentemente
int carica ( lista_ptr * pila) {
struct strut_persona nuovo;
lista_ptr temp= NULL ;
file = fopen(FILE_NAME, "r");
/*if ( file == NULL) {
file = fopen(FILE_NAME, "w+");
fseek(file, 0, SEEK_END);
}*/
if(file!=NULL)
{
while(!feof(file)){
temp = ( struct lista *)malloc(sizeof(struct lista));
fread ( &nuovo, sizeof(struct strut_persona), 1 , file);
strncpy(temp->persona.cognome, nuovo.cognome,SIZE);
strncpy(temp->persona.nome,nuovo.nome, SIZE);
strncpy(temp->persona.indirizzo, nuovo.indirizzo, SIZE);
strncpy(temp->persona.numtel, nuovo.numtel, CORSO);
strncpy(temp->persona.corso, nuovo.corso, CORSO);
strncpy(temp->persona.mese, nuovo.mese, MESE);
strncpy(temp->persona.anno, nuovo.anno, 4);
temp->next = *pila;
*pila = temp; }fclose(file);
}
//else
//printf("File non esistente");
return TRUE;
}
//visualizza il menu
int menu() {
int scelta;
printf("\n\n----------MENU--------- \n");
printf("\nInserisci : \n");
printf("1 : per inserire persona\n");
printf("2 : per eliminare persona\n");
printf("3 : per cercare una persona\n");
printf("4 : stampa\n");
printf("5 : exit\n");
printf("Inserire numero della scelta: ");
scanf("%d", &scelta);
return scelta;
}
//inserisce un allievo nella lista
int inserisci_persona( lista_ptr *pila) {
char static nome[SIZE];
char static cognome[SIZE];
char static indirizzo[SIZE];
char static corso[CORSO];
char static numtel[CORSO];
char static mese[MESE];
char static anno[4];
printf("Inserisci Nome : ");
scanf("%s",nome);
printf("Inserisci Cognome : ");
scanf("%s",cognome);
printf("Inserisci Indirizzo : ");
scanf("%s",indirizzo);
printf("Numero telefono: ");
scanf("%s",numtel);
printf("Corso: ");
scanf("%s",corso);
printf("Mese ultimo pagamento: ");
scanf("%s",mese);
printf("Anno ultimo pagamento: ");
scanf("%s",anno);
// inserimento nella lista o meglio nella pila
if ( *pila == NULL) {
*pila = ( struct lista * ) malloc( sizeof(struct lista ));
strncpy((*pila)->persona.nome, nome, SIZE);
strncpy( (*pila)->persona.cognome, cognome, SIZE);
strncpy( (*pila)->persona.indirizzo, indirizzo, SIZE);
strncpy( (*pila)->persona.numtel, numtel, CORSO);
strncpy( (*pila)->persona.corso, corso, CORSO);
strncpy( (*pila)->persona.mese, mese, MESE);
strncpy( (*pila)->persona.anno, anno, 4);
(*pila)->next = NULL;
}
else {
struct lista static *nuovo;
nuovo = ( struct lista * ) malloc( sizeof(struct lista ));
strncpy(nuovo->persona.nome, nome, SIZE);
strncpy(nuovo->persona.cognome,cognome, SIZE);
strncpy(nuovo->persona.indirizzo, indirizzo, SIZE);
strncpy(nuovo->persona.numtel, numtel, CORSO);
strncpy(nuovo->persona.corso, corso, CORSO);
strncpy(nuovo->persona.mese, mese, MESE);
strncpy( (*pila)->persona.anno, anno, 4);
nuovo->next = *pila;
*pila = nuovo;
}
salva(*pila);
return TRUE;
}
//stampa la lista degli allievi con indirizzo numtel e corso
void stampa( const struct lista * pila ) {
while ( pila != NULL)
{
printf (" Nome: %s\n", pila->persona.nome);
printf(" Cognome: %s\n", pila->persona.cognome);
printf(" Indirizzo: %s\n", pila->persona.indirizzo);
printf(" Corso: %s\n", pila->persona.corso);
printf(" Numero di telefono: %s\n", pila->persona.numtel);
pila=pila->next;
}
}
//elimina allievo
int elimina_persona( lista_ptr * pila) {
char nome[SIZE];
char cognome[SIZE];
lista_ptr temp = NULL , temp_pre = NULL ;
printf ("Inserisci nome della persona da eliminare : ");
scanf ("%s", nome);
printf ("Inserisci cognome della persona da eliminare : ");
scanf ("%s", cognome);
if ( (*pila == NULL) ) printf("elemento non presente ");
// nel caso sia in testa
if ( strcmp( (*pila)->persona.nome, nome) == 0 && strcmp( (*pila)->persona.cognome, cognome) == 0 ) {
temp = *pila;
(*pila) = (*pila)->next;
free(temp);
return TRUE;
}
temp = *pila; // variabile di appoggio per scorrere la lista
while ( temp != NULL) {
if ( strcmp( (*pila)->persona.nome, nome) == 0 && strcmp( (*pila)->persona.cognome, cognome) == 0 ) {
temp_pre->next = temp->next;
free(temp);
return TRUE;
}
temp_pre = temp;
temp = temp->next;
}
salva(*pila);
return FALSE;
}
//richiede dati della persona da cercare e lancia la ricerca nella lista
int cerca ( const lista_ptr pila) {
char nome[SIZE],cognome[SIZE];
lista_ptr risultato;
printf ("Inserisci nome : ");
scanf ("%s", nome);
printf ("Inserisci cognome : ");
scanf ("%s", cognome);
risultato = cerca_ric(pila, nome, cognome);
if ( risultato == NULL) {
printf("Persona non presente\n");
return FALSE;
}
else {
visualizza(risultato);
return TRUE;
}
}
//visualizza la persona trovata
void visualizza(const lista_ptr pila)
{
printf("\n------------------------");
printf (" \nNome: %s\n", pila->persona.nome);
printf(" Cognome: %s\n", pila->persona.cognome);
printf(" Indirizzo: %s\n", pila->persona.indirizzo);
printf(" Corso: %s\n", pila->persona.corso);
printf("------------------------\n");
}
//scorre la lista e cerca allievi prendendo in entrata nom e cognome dalla funz. prec.
lista_ptr cerca_ric ( const lista_ptr pila , char * nome, char * cognome) {
if ( pila == NULL) return 0;
if ( strcmp (pila->persona.nome, nome) == 0 && strcmp (pila->persona.cognome, cognome) == 0 ) return pila;
else cerca_ric(pila->next, nome, cognome);
}
//salva la lista su file
int salva ( const lista_ptr pila ) {
lista_ptr temp = pila ;
struct strut_persona app;
file = fopen ( FILE_NAME,"w+");
while (temp != NULL) {
strncpy(app.nome, temp->persona.nome, SIZE);
strncpy(app.cognome, temp->persona.cognome, SIZE);
strncpy(app.indirizzo, temp->persona.indirizzo, SIZE);
strncpy(app.numtel, temp->persona.numtel, CORSO);
strncpy(app.corso, temp->persona.corso, CORSO);
strncpy(app.mese, temp->persona.mese, MESE);
strncpy(app.anno, temp->persona.anno, 4);
fwrite( &app, sizeof(struct strut_persona), 1, file);
temp= temp->next;
}
fclose(file);
return TRUE;
}
//CERCA PER CORSO
/*int cerca_corso ( const lista_ptr pila, char * corso) {
char corso[SIZE];
printf ("Inserisci corso : ");
scanf ("%s", corso);
while ( pila != NULL)
{
if ( strcmp (pila->persona.corso, corso) == 0){
printf (" Nome: %s\n", pila->persona.nome);
printf(" Cognome: %s\n", pila->persona.cognome);
printf(" Indirizzo: %s\n", pila->persona.indirizzo);
printf(" Corso: %s\n", pila->persona.corso);
printf(" Numero di telefono: %s\n", pila->persona.numtel);
pila=pila->next;}
else pila=pila->next;
} */