#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static FILE *fp;
// struttura del nodo
typedef struct dato{
int n;
char nome[10];
}element_type;
typedef struct elemento {
element_type value;
struct elemento *next;
} nodo;
typedef nodo *list;
list root = NULL;
//prototipi
list inputFile();
list cons_sort(element_type,list);
int Menu();
int empty(list);
void insertContatto();
void stampaContatti(list,int);
void deleteContatto(list);
void update(list);
//main principale
main() {
int x=1;
do{
system("color 2c");
x=Menu();
}while(x!=0);
system("PAUSE");
}
// menu di scelta multipla
int Menu()
{
int y=0;
printf("\nPREMERE:\n\t[1] Inserisci nuovo contatto\n\n\t[2] Cerca contatto\n\n\t[3] Elimina contatto\n\n\t[4] Visualizza tutti i contatti\n\n\t[5] Esci \n");
scanf("%d",&y);
switch(y){
case 1: insertContatto(); return 1;
case 2: root = inputFile(); stampaContatti(root,1); return 1;
case 3: root = inputFile(); deleteContatto(root); return 1;
case 4: root = inputFile(); stampaContatti(root,0); return 1;
case 5: return 0;
};
}
//
void update(list L){
element_type EL;
if((fp = fopen("MyContatti.dat","wb")) == NULL){ //apro il file in modalità scrittura cosi riscritta l'intera
printf("Errore durante l'apertura del file...");//rubrica tranne il contatto eliminato
}else{
system("CLS");
printf("\n\tUpdate in corso.......\n");
rewind(fp);
while(L != NULL){
EL.n = L->value.n;
strcpy(EL.nome,L->value.nome);
fwrite(&EL,sizeof(element_type),1,fp);
L = L->next;
}
fclose(fp);
system("CLS");
stampaContatti(root,0);
printf("\n\tUpdate seseguito con successo\n");
}
}
// elimina un contatto dalla rubrica
void deleteContatto(list L){
list prov,cur,temp;
char N[10];
system("CLS");
printf("\nInserisci il nome del contatto da eliminare:\t");
scanf("%s",&N);
if(!empty(L)){
if(strcmp(N,L->value.nome) == 0){//elimina il primo nodo
temp = L;//memorizza il nodo che sta per essere rimosso
L = L->next;//sfila il nodo
free(temp);// libera memoria
update(L);
}else{
prov = L;
cur = L->next;
//esegue un ciclo per trivare la posizione corretta
while(cur != NULL && strcmp(N,cur->value.nome)){
prov = cur; //passa al....
cur = cur->next;//...prossimo nodo
}//fine while
if(cur != NULL){//elimina il nodo puntato da cur
temp = cur;
prov->next = cur->next;
free(temp);
update(L);
}else{
printf("%s Non contenuto in rubrica",N
);
}
}
}else printf("\n\tLa rubrica non contiene nessun elemento..\n");
}
//controllo lista vuota
int empty(list h){
if(h == NULL)return 1;
else return 0;
}
//crea una lista ordinata in ordine crescente in base al numero
list cons_sort(element_type e, list l){
list newp;// puntatore al nuovo nodo
list prov;// puntatore al nodo precedente della lista
list cur;// puntatore al nodo corrente della lista
newp = (list)malloc(sizeof(nodo));//crea il nuovo nodo
newp->value.n = e.n;
strcpy(newp->value.nome,e.nome);//memorizza valore nel nodo
newp->next = NULL; // il nodo nn è collegato a nessun altro nodo
prov = NULL;
cur = l;
//esegue un ciclo per trovare la posizione corretta nella lista
while(cur != NULL && (strcmp(e.nome, cur->value.nome) > 0)){
prov = cur; //passa al....
cur = cur->next;//...prossimo nodo
}
if(prov == NULL){//inserisce il nodo in testa alla lista
newp->next = l;
l = newp;
}else{//inserisce il nodo tra prov e curr
prov->next = newp;
newp->next = cur;
}
return l;
}
void insertContatto(){
int c = 0;
element_type EL;
system("CLS");
printf("\nIntrodurre nome: \t");
scanf("%s", EL.nome);
printf("\nIntrodurre numero: \t");
scanf("%d", &EL);
list Templist;
Templist = inputFile();
while(Templist != NULL){
if(strcmp(EL.nome, Templist->value.nome) == 0){c = 1;}
Templist = Templist->next;
}
if(c == 0){
if((fp = fopen("MyContatti.dat","ab")) == NULL){
printf("Errore durante l'apertura del file...");
}else{
system("CLS");
printf("\n\tSalvataggio in corso.......\n");
fwrite(&EL,sizeof(element_type),1,fp);
rewind(fp);
fclose(fp);
system("CLS");
printf("\n\tDati salvati con successo\n");
}
}else system("CLS");printf("\nImpossibile salvare [ %s ] nome gia presente nella rubrica\nDevi cambiare il nome\n",EL.nome);
}
list inputFile(){
list newroot = NULL;
element_type T;
if((fp = fopen("MyContatti.dat","rb")) == NULL){
printf("Errore durante l'apertura del file...");
return NULL;
}else{
rewind(fp);//posiziono fp in testa al file
fread(&T, sizeof(element_type), 1, fp);
while(!feof(fp)){
newroot = cons_sort(T,newroot);
fread(&T, sizeof(element_type), 1, fp);
}
fclose(fp);
}
return newroot;
}
// stampa lista data
void stampaContatti(list r,int x){
int count = 0;
system("CLS");
if(!empty(r)){
if(x == 0){
printf("\n------------------------------\n\t| NOME | | NUMERO |\n------------------------------\n");
while(r != NULL){
printf("\t%s\t%d\n\n", r
->value.
nome, r
->value.
n);
count++;
r = r->next;
}
printf("------------------------------\n %d Contatti \n------------------------------\n",count
);
}else if(x == 1){
char c;
char temp[10];
scanf("%s",&c);
printf("\n------------------------------\n\t| NOME | | NUMERO |\n------------------------------\n");
while(r != NULL){
strcpy(temp,r->value.nome);
if(c == temp[0]){
count++;
printf("\t%s\t%d\n\n", r
->value.
nome, r
->value.
n);
}
r = r->next;
}
if(count
== 0
)printf("\n\tNessun contatto\n");
printf("------------------------------\n");
}
}else printf("\n\tLa rubrica non contiene nessun elemento..\n");
}