vuoi
o PayPal
tutte le volte che vuoi
case 4:
rubrica = elimina(rubrica);
printf("\n...contatto eliminato!");
break;
}
stampa(rubrica);
printf("\n\nCosa vuoi fare?\n");
printf("1. Visualizza dettagli\n");
printf("2. Aggiungi\n");
printf("3. Modifica\n");
printf("4. Elimina\n");
printf("5. Esci\n");
scanf("%d",&scelta);
if( scelta < 1 || scelta > 5 ) printf("\n************Scelta
non valida*****************\n");
} while( scelta != 5 );
// Alla chiusura, il programma aggiorna il file rubrica.txt
aggiorna(rubrica);
return 0;
}
/* DEFINIZIONE FUNZIONI */
/*
* Stampa la rubrica ( solo nome e cognome )
* @param p puntatore alla testa della lista
* @return void
*/
void stampa(struct contact *p) {
fflush(stdin);
p = ordina(p);
ptr = p;
i=0;
if ( p == NULL )
printf("\nNessun contatto presente.");
else {
printf("\nContatti:");
while ( ptr != NULL ) {
printf("\n%d. ",i+1);
if ( strcmp(ptr->nome," ") != 0 )
printf("%s ",ptr->nome);
if ( strcmp(ptr->cognome," ") != 0 )
printf("%s",ptr->cognome);
ptr = ptr->next;
i++;
}
}
}
/*
* Stampa la rubrica con i dettagli dei contatti.
* @param p puntatore alla testa della lista
* @return void
*/
void stampa_dettagli(struct contact *p) {
fflush(stdin);
ptr = p;
printf("\n");
if ( p == NULL )
printf("\nNessun contatto presente.");
else while ( ptr != NULL ) {
printf("\n");
if ( strcmp(ptr->nome," ") != 0 )
printf("%s ",ptr->nome);
if ( strcmp(ptr->cognome," ") != 0 )
printf("%s",ptr->cognome);
printf("\n");
if ( strcmp(ptr->tel," ") != 0 )
printf("%s",ptr->tel);
printf("\n");
ptr = ptr->next;
}
}
/*
* Stampa i dettagli di un singolo contatto
* @param p puntatore alla testa della lista
* @param n nodo da visualizzare
* @return void
*/
void stampa_contatto(struct contact *p,int n) {
fflush(stdin);
ptr = p;
for ( i=1; i<n; i++)
ptr = ptr->next;
printf("\n");
if ( strcmp(ptr->nome," ") != 0 )
printf("%s ",ptr->nome);
if ( strcmp(ptr->cognome," ") != 0 )
printf("%s",ptr->cognome);
printf("\n");
if ( strcmp(ptr->tel," ") != 0 )
printf("%s",ptr->tel);
printf("\n");
}
/*
* Inizializza la lista concatenata a partire dal file rubrica.txt
* @param void
* @return p La lista appena creata
*/
struct contact *inizializza() {
fflush(stdin);
struct contact *p;
char c;
if( (pf = fopen("rubrica.txt","r")) == NULL ){
printf("\nErrore apertura file");
fclose(pf);
return NULL;
}
if( (c=fgetc(pf)) == EOF ) {
fclose(pf);
return NULL; // Se il file e' vuoto restituisco NULL
}
// Creo primo elemento
p = (struct contact *)malloc(sizeof(struct contact));
// Leggo NOME
for( i=0; (c=fgetc(pf)) != '-'; i++)
bNome[i] = c;
bNome[i] = '\0';
strcpy(p->nome,bNome);
// Leggo COGNOME
for( i=0; (c=fgetc(pf)) != '-'; i++)
bCognome[i] = c;
bCognome[i] = '\0';
strcpy(p->cognome,bCognome);
// Leggo TELEFONO
for( i=0; (c=fgetc(pf)) != '\n'; i++)
bTel[i] = c;
bTel[i] = '\0';
strcpy(p->tel,bTel);
// Se non ci sono altri elementi ritorno la lista con un solo
elemento
if ( (c=fgetc(pf)) == EOF ) {
fclose(pf);
p->next = NULL;
return p;
} else { // Altrimenti continuo a leggere il file
ptr = p; // Faccio puntare p alla testa della lista
do { ptr->next = (struct contact *)malloc(sizeof(struct
contact)); ptr = ptr->next;
// Leggo NOME
for( i=0; (c=fgetc(pf)) != '-'; i++)
bNome[i] = c;
bNome[i] = '\0';
strcpy(ptr->nome,bNome);
// Leggo COGNOME
for( i=0; (c=fgetc(pf)) != '-'; i++)
bCognome[i] = c;
bCognome[i] = '\0';
strcpy(ptr->cognome,bCognome);
// Leggo TELEFONO
for( i=0; (c=fgetc(pf)) != '\n'; i++)
bTel[i] = c;
bTel[i] = '\0';
strcpy(ptr->tel,bTel);
} while ( (c=fgetc(pf)) != EOF );
ptr->next = NULL;
fclose(pf);
return p;
}
}
/*
* Aggiorna il file rubrica.txt
* @param p puntatore alla testa della lista
* @return void
*/
void aggiorna(struct contact *p) {
fflush(stdin);
ptr = p;
if( (pf = fopen("rubrica.txt","w")) == NULL )
printf("\nErrore apertura file");
else while( ptr != NULL) {
fprintf(pf," %s-",ptr->nome);
fprintf(pf,"%s-",ptr->cognome);
fprintf(pf,"%s\n",ptr->tel);
ptr = ptr->next;
}
fclose(pf);
}
/*
* Aggiunge un nodo alla lista
* @param p puntatore alla testa della lista
* @return p la lista aggiornata con il nuovo elemento
*/
struct contact *aggiungi(struct contact *p) {
fflush(stdin);
// Se la lista e' vuota creo il primo elemento
if ( p == NULL ) {
p = (struct contact *)malloc(sizeof(struct contact));
printf("\nInserisci nome: ");
gets(bNome);
if ( strcmp(bNome,"\0") == 0 ) // Controllo se non e'
stato inserito nessun valore
strcpy(bNome," ");
strcpy(p->nome,bNome);
printf("\nInserisci cognome: ");
gets(bCognome);
if ( strcmp(bCognome,"\0") == 0 ) // Controllo se non e'
stato inserito nessun valore
strcpy(bCognome," ");
strcpy(p->cognome,bCognome);
printf("\nInserisci telefono: ");
gets(bTel);
if ( strcmp(bTel,"\0") == 0 ) // Controllo se non e'
stato inserito nessun valore
strcpy(bTel," ");
strcpy(p->tel,bTel);
p->next = NULL;
return p;
} else {
ptr = p;
while( ptr->next != NULL ) ptr = ptr->next; // Scorro
la lista fino all'ultimo nodo
ptr->next = (struct contact *)malloc(sizeof(struct contact));
// Creo il nuovo nodo
ptr = ptr->next;
printf("\nInserisci nome: ");
gets(bNome);
if ( strcmp(bNome,"\0") == 0 )
strcpy(bNome," ");
strcpy(ptr->nome,bNome);
printf("\nInserisci cognome: ");
gets(bCognome);
if ( strcmp(bCognome,"\0") == 0 )
strcpy(bCognome," ");
strcpy(ptr->cognome,bCognome);
printf("\nInserisci telefono: ");
gets(bTel);
if ( strcmp(bTel,"\0") == 0 )
strcpy(bTel," ");
strcpy(ptr->tel,bTel);
}
ptr->next = NULL;
return p;
}
/*
* Ordina la lista.
* @param p puntatore alla testa della lista
* @return p la lista ordinata
*/
struct contact *ordina(struct contact *p) {
fflush(stdin);
struct contact *ptr1, *ptr2;
char temp[N];
if ( p == NULL) return NULL;
else {
ptr1 = p;
while( ptr1->next != NULL) {
ptr2 = ptr1->next;
while( ptr2 != NULL ) {
if ( strcmp(ptr2->nome,ptr1->nome) < 0 ){
strcpy(temp,ptr1->nome);
strcpy(ptr1->nome,ptr2->nome);
strcpy(ptr2->nome,temp);
strcpy(temp,ptr1->cognome);
strcpy(ptr1->cognome,ptr2->cognome);
strcpy(ptr2->cognome,temp);
strcpy(temp,ptr1->tel);
strcpy(ptr1->tel,ptr2->tel);
strcpy(ptr2->tel,temp);
}
ptr2 = ptr2->next;
}
ptr1 = ptr1->next;
}
return p;
}
}
/*
* Modifica un contatto
* @param p puntatore alla testa della lista
* @return p la lista modificata
*/
struct contact *modifica(struct contact *p) {
fflush(stdin);
ptr = p;
int n, risp;
printf("\nInserisci il numero dell'elemento da modificare: ");
scanf("%d",&n);
fflush(stdin);
for ( i=1; i<n; i++)