Salve a tutti ragazzi, ho implementato un algoritmo per il seguente problema. Verificatelo e fatemi sapere "ogni" eventuale imprecisione
grazie, *ELY*

Esercitazione 9: liste ordinate doppiamente concatenate

Scrivere un algoritmo che simuli la gestione di un'agenda telefonica.
Le specifiche del problema sono le seguenti:
- Ciascun dato dell'agenda è costituito da un nome ed un numero di telefono
- deve poter essere inserito un nuovo dato.
- Un dato già inserito deve poter essere modificato.
- i dati sono memorizzati in ordine alfabetico.
- deve essere possibile visualizzare i dati dell'agenda singolarmente oppure simulando uno scrooling che opera in senso crescente e decrescente (così come avviene in un telefono cellulare)
- I dati inizialmente devono essere letti da un file e in chiusura salvati sulo stesso file.

Suggerimento: utilizzare un menù per gestire le varie operazioni
Utilizzare una lista doppiamente concatenata per gestire i dati durante l'esecuzione del programma.

Buon lavoro!.

L'algoritmo da me implementato è il seguente:


------------------------------------------------
codice:
#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)
	{
   fclose(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';
      }
   }
}