#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define dim 35
typedef struct nodo *node_pointer;
typedef struct nodo {
char cognome[dim];
char nome[dim];
char numero[dim];
node_pointer link_sx;
node_pointer link_dx;
} nodo;
node_pointer davanti=NULL, dietro=NULL;
int n;
char str1[dim], str2[dim], str3[dim];
void insert(node_pointer *, node_pointer *);
void print(node_pointer);
void modifica(node_pointer);
void trova(node_pointer);
void scorri(void);
main()
{
int scelta=-1;
FILE *fp;
fp=fopen("rubr.txt", "r+");
if(!fp)
{
fp=fopen("rubr.txt", "w");
}
else
{
while(!feof(fp))
{
fscanf(fp, "%s %s %s ", str1, str2, str3);
insert(&davanti, &dietro);
}
rewind(fp);
}
n=0;
printf("\n\t\t\tRUBRICA\n");
while(scelta)
{
printf("\n\n\n\t(1)\tInserisci nuovo contatto\n\t(2)\tModifica contatto\n\t(3)\tVisualizza contatto singolo\n\t(4)\tScorri rubrica\n\t(0)\tEsci dal programma\n\nSeleziona la tua scelta: ");
scanf("%d", &scelta);
switch(scelta)
{
case 1: printf("\n\tNUOVO CONTATTO\n\n");
printf("\nInserisci cognome: ");
scanf("%s", str1);
printf("\nInserisci nome: ");
scanf("%s", str2);
printf("\nInserisci numero: ");
scanf("%s", str3);
insert(&davanti, &dietro);
break;
case 2: printf("\n\tMODIFICA CONTATTO\n\n");
modifica(davanti);
scelta=2;
break;
case 3: printf("\n\tVISUALIZZA UN CONTATTO\n\n");
trova(davanti);
break;
case 4: printf("\n\tSCORRI RUBRICA\n\n");
scorri();
scelta=4;
break;
case 0: break;
default: printf("\n\nScelta errata! Seleziona nuovamente la tua scelta\n");
scelta=-1;
break;
}
}
while(!feof(fp) && davanti)
{
fprintf(fp, "%s %s %s\n", davanti->cognome, davanti->nome, davanti->numero);
davanti=davanti->link_dx;
}
fclose(fp);
fflush(stdin);
getchar();
}
void insert(node_pointer *davanti, node_pointer *dietro)
{
node_pointer ptr, temp=(node_pointer)malloc(sizeof(nodo));
if(!temp)
{
printf("\nMEMORIA PIENA!");
exit(1);
}
n++;
strcpy(temp->cognome, str1);
strcpy(temp->nome, str2);
strcpy(temp->numero, str3);
if(!*davanti)
{
temp->link_sx=NULL;
temp->link_dx=NULL;
*davanti=temp;
*dietro=temp;
}
else
if(strcmp((*davanti)->cognome, temp->cognome)>0)
{
temp->link_sx=NULL;
temp->link_dx=*davanti;
(*davanti)->link_sx=temp;
*davanti=temp;
}
else
{
ptr=*davanti;
while(ptr->link_dx && (strcmp(ptr->link_dx->cognome, temp->cognome))<0)
ptr=ptr->link_dx;
if(!ptr->link_dx)
{
temp->link_sx=*dietro;
temp->link_dx=NULL;
(*dietro)->link_dx=temp;
*dietro=temp;
}
else
{
temp->link_sx=ptr;
temp->link_dx=ptr->link_dx;
ptr->link_dx=temp;
}
}
}
void print(node_pointer ptr)
{
if(!ptr)
printf("\nRubrica vuota!");
else
while(ptr)
{
printf("\n%15s%15s%15s", ptr->cognome, ptr->nome, ptr->numero);
ptr=ptr->link_dx;
}
}
void modifica(node_pointer ptr)
{
char scegli;
if(!ptr)
printf("\nRubrica vuota!");
else
{
printf("\nInserisci cognome: ");
scanf("%s", str1);
printf("\nInserisci nome: ");
scanf("%s", str2);
while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
ptr=ptr->link_dx;
if(!ptr)
printf("\nContatto assente!");
else
{
printf("\nContatto: %s %s %s\n", ptr->cognome, ptr->nome, ptr->numero);
printf("\nVuoi modificare il cognome?(s/n) ");
scanf("%1s", &scegli);
if(scegli!='n')
{
printf("\nInserisci nuovo cognome: ");
scanf("%s", str1);
strcpy(ptr->cognome, str1);
}
printf("\nVuoi modificare il nome?(s/n) ");
scanf("%1s", &scegli);
if(scegli!='n')
{
printf("\nInserisci nuovo nome: ");
scanf("%s", str1);
strcpy(ptr->nome, str1);
}
printf("\nVuoi modificare numero?(s/n) ");
scanf("%1s", &scegli);
if(scegli!='n')
{
printf("\nInserisci nuovo numero: ");
scanf("%s", str1);
strcpy(ptr->numero, str1);
}
}
}
}
void trova(node_pointer ptr)
{
printf("\nInserisci cognome: ");
scanf("%s", str1);
printf("\nInserisci nome: ");
scanf("%s", str2);
while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
ptr=ptr->link_dx;
if(!ptr)
printf("\nContatto assente!");
else
printf("\n%s %s %s", ptr->cognome, ptr->nome, ptr->numero);
}
void scorri(void)
{
char scegli;
node_pointer ptr=davanti;
while(scegli!='0')
{
printf("\n%s %s %s\n\nVuoi andare al precedente(p) al successivo(s) o uscire(0)? ", ptr->cognome, ptr->nome, ptr->numero);
scanf("%1s", &scegli);
switch(scegli)
{
case 'p': if(ptr==davanti)
printf("\nNon ci sono contatti precedenti!");
else
ptr=ptr->link_sx;
break;
case 's': if(ptr==dietro)
printf("\nNon ci sono contatti successivi!");
else
ptr=ptr->link_dx;
break;
case '0': break;
default: scegli='a';
}
}
}