PDA

Visualizza la versione completa : [c]: liste ordinate per gestione rubrica telefonica (ERA:problema del labirinto)


elysed
01-10-2004, 10:59
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:


------------------------------------------------


#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';
}
}
}

unomichisiada
01-10-2004, 11:28
Scrivere un algoritmo che simuli la gestione di un'agenda telefonica
E il labirinto???? :master:



Metti i tag '[CODE]'!

elysed
01-10-2004, 11:38
opsssss... scusami che sbadata....
Il labirinto non c'entrava niente!!!

unomichisiada
01-10-2004, 14:28
fp=fopen("rubr.txt", "r+");
if(!fp)
{
fclose(fp);//<-----Non ci vuole
fp=fopen("rubr.txt", "w");
}
else
Ho già beccato un errore!Quella fclose non ci vuole (e infatti il prog crasha)perchè se fopen ritorna null (cioè se entri nell'if) non c'è nessun puntatore a file da rilasciare.

elysed
01-10-2004, 15:10
è vero.. non l'avevo notato, ke sbadata!

Grazie :smack:

Loading