PDA

Visualizza la versione completa : [C] Aiuto su agenda telefonica - liste doppiamente concatenate


sushimye
01-07-2009, 13:33
Salve a tutti, come da titolo sto scrivendo un programma che simula la gestione di un'agenda telefonica (uguale a quello di un altro 3d che ho letto qui nel forum), che quindi prevede l'inserimento di nuovi elementi, la modifica e la cancellazione di elementi esistenti, la visualizzazione dell'intera rubrica, e la visualizzazione in modalitÓ scrolling (s=successivo, p=precedente (in assenza di altri metodi migliori)). I record devono essere in ordine alfabetico, e devono essere presi da un file (se esiste e ha giÓ elementi) all'apertura, e salvati su di esso alla chiusura del programma.

Il programma funziona, l'unico problema Ŕ che non devo azzardarmi ad entrare nella modalitÓ scrolling, perchŔ quando torno al men¨ (lo scrolling sembra funzionare benissimo) inizia ad incasinarsi tutto: ad esempio digito 1 (per inserire un nuovo dato) e invece mi chiede quale elemento voglio cancellare (2); oppure quando riesco ad inserire un elemento, gli chiedo di farmene inserire solo uno e invece me ne fa inserire di pi¨ (infinite volte, apparentemente); o ancora se riesco ad inserirne uno poi mi visualizza caratteri strani al posto del nome corretto; se invece chiudo (tasto 7), esce ma dÓ un errore e non salva niente.

Ho spulciato un p˛ tutto, provato a modificare mille cose ma non sono riuscito a risolvere nulla.
Ripeto, se faccio partire il programma e lo utilizzo senza toccare la modalitÓ scrolling, tutto funziona alla perfezione, ma se entro nella modalitÓ scrolling impazzisce come giÓ detto.

Posto il codice:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*_________________________________________________ ______DICHIARAZIONI GLOBALI*/
typedef struct list_node *list_pointer;
typedef struct list_node {
list_pointer sinistra;
char nome[15];
double numero;
list_pointer destra;
} lista;

list_pointer testa=NULL;

#define IS_FULL(ptr) (!(ptr))
#define IS_EMPTY(ptr) (!(ptr))
/*_________________________________________________ ___________________________*/
/*_________________________________________________ ________PROTOTIPI VARIABILI*/
void inserisci(list_pointer *, char [15], double);
void insert_testa(list_pointer *, char [15], double);
void insert_dopo(list_pointer *, list_pointer, char [15], double);
void cancella(list_pointer *, char [15]);
void cancella_dopo(list_pointer *, list_pointer, list_pointer);
void visualizza(list_pointer);
void scrolling(lista *);
/*_________________________________________________ ___________________________*/
/*_________________________________________________ _______________________MAIN*/
int main(){
FILE *fp;
int scelta;
double numero;
char nome[10];
fp=fopen("agenda.txt", "r");
if(!fp)
perror("\nErrore di apertura file\n");
else
{while(!feof(fp))
{fscanf(fp, "%s\t%lf\n", &nome, &numero);
inserisci(&testa, nome, numero);
}
fclose(fp);
}

visualizza (testa);
do{
printf("\nScegli opzione:\n");
printf("\t1) Inserire nuovo elemento;\n");
printf("\t2) Cancellare elemento esistente;\n");
printf("\t3) Visualizzare intera agenda;\n");
printf("\t4) Modificare un elemento esistente;\n");
printf("\t5) Visualizzare in modalitÓ scrolling;\n");
printf("\t6) Resetta agenda;\n");
printf("\t7) Esci.\n");
scanf("%d", &scelta);
switch(scelta)
{case 1: {int i, dim=0;
printf("\nQuanti elementi vuoi inserire? ");
scanf("%d", &dim);
for(i=0 ; i<dim ; i++)
{printf("\nInserisce nome: ");
scanf("%s", &nome);
printf("\nInserisci numero: ");
scanf("%lf", &numero);
inserisci(&testa, nome, numero);
}
}
scelta=1;
break;
case 2: printf("\nChe elemento vuoi cancellare? ");
scanf("%s", &nome);
cancella(&testa, nome);
scelta=2;
break;
case 3: visualizza(testa);
scelta=3;
break;
case 4: printf("\nChe elemento vuoi modificare? ");
scanf("%s", &nome);
cancella(&testa, nome);
printf("\nInserisce nome: ");
scanf("%s", &nome);
printf("\nInserisci numero: ");
scanf("%lf", &numero);
inserisci(&testa, nome, numero);
scelta=4;
break;
case 5: scrolling(testa);
scelta=5;
break;
case 6: if((remove("agenda.txt"))==-1)
perror("Errore nella cancellazione del file");
else
{puts("File cancellato");
testa=NULL;}
scelta=6;
break;
case 7: if(!testa)
if((remove("agenda.txt"))==-1)
perror("Errore nella cancellazione del file");
else
puts("File cancellato");
else
{
fp=fopen("agenda.txt", "w");
while(testa)
{fprintf(fp, "%-15.15s\t%11.0lf\n", testa->nome, testa->numero);
testa=testa->destra;
}
fclose(fp);
}
scelta=7;
break;
}
}while(scelta!=7);

system("PAUSE");
return 0;
}
/*_________________________________________________ ___________________________*/
/*_________________________________________________ __________________INSERISCI*/
void inserisci(list_pointer *testa, char nome[15], double numero)
{
list_pointer nodo, ptr;

ptr=*testa;
nodo=ptr;

if(ptr && (strcoll(nome, ptr->nome)<0))
insert_testa(testa, nome, numero);
else
{for(; ptr && (strcoll(nome, ptr->nome))>0 ; ptr=ptr->destra)
nodo=ptr;
insert_dopo(testa, nodo, nome, numero);
}
}
/*_________________________________________________ ___________________________*/
/*_________________________________________________ _________INSERISCI IN TESTA*/
void insert_testa(list_pointer *ptr, char nome[15], double numero)
{
list_pointer temp;

temp=(list_pointer)malloc(sizeof(list_node));
if(IS_FULL(temp))
{fprintf(stderr, "La memoria e' piena");
exit (1);
}
strcpy(temp->nome, nome);
temp->numero=numero;
temp->destra=*ptr;
temp->sinistra=NULL;
(*ptr)->sinistra=temp;
*ptr=temp;
}
/*_________________________________________________ ___________________________*/
/*_________________________________________________ _____________INSERISCI DOPO*/
void insert_dopo(list_pointer *ptr, list_pointer nodo, char nome[15], double numero)
{
list_pointer temp;

temp=(list_pointer)malloc(sizeof(list_node));
if(IS_FULL(temp))
{fprintf(stderr, "La memoria e' piena");
exit(1);
}
strcpy(temp->nome, nome);
temp->numero=numero;
if(*ptr)
{temp->destra=nodo->destra;
temp->sinistra=nodo;
nodo->destra=temp;
}
else
{temp->destra=NULL;
temp->sinistra=NULL;
*ptr=temp;
}
}
/*_________________________________________________ ___________________________*/
/*_________________________________________________ ___________________CANCELLA*/
void cancella(list_pointer *testa, char nome[15])
{
list_pointer nodo, ptr;

if(IS_EMPTY(testa))
{printf("\nLa lista e' vuota");
return;
}
ptr=*testa;
for(; ptr && (strcoll(ptr->nome, nome)!=0) ; ptr=ptr->destra)
nodo=ptr;
if(ptr==NULL)
printf("\nL'elemento non e' presente nella lista");
else
{if(ptr==*testa)
nodo=NULL;
cancella_dopo(testa, nodo, ptr);
}
}
/*_________________________________________________ ___________________________*/
/*_________________________________________________ ______________CANCELLA DOPO*/
void cancella_dopo(list_pointer *testa, list_pointer nodo, list_pointer ptr)
{
if(nodo)
nodo->destra=ptr->destra;
else
*testa=(*testa)->destra;
free(ptr);
}
/*_________________________________________________ ___________________________*/
/*_________________________________________________ _________________VISUALIZZA*/
void visualizza(list_pointer ptr)
{
if(IS_EMPTY(ptr))
{printf("\nLa lista e' vuota");
return;
}
printf("\nLa lista contiene:\n");
for(; ptr ; ptr=ptr->destra)
printf("%-15.15s\t%11.0lf\n", ptr->nome, ptr->numero);
printf("\n");
}
/*_________________________________________________ ___________________________*/
/*_________________________________________________ __________________SCROLLING*/
void scrolling(lista *ptr)
{
char t;
if(IS_EMPTY(ptr))
{printf("\nLa lista e' vuota");
return;
}
printf("\n\t\t\t*****************************************");
printf("\n\t\t\t* p= precedente s= successivo e= esci *");
printf("\n\t\t\t*****************************************\ n");
do
{
printf("\n%-15.15s\t%11.0lf\t", ptr->nome, ptr->numero);
scanf("%s", &t);
if(t=='p')
if(ptr->sinistra)
ptr=ptr->sinistra;
else
printf("\nINIZIO LISTA\n");
if(t=='s')
if(ptr->destra)
ptr=ptr->destra;
else
printf("\nFINE LISTA\n");
}while(t!='e');
printf("Esci da modalita' scrolling.\n");
}
/*_________________________________________________ ___________________________*/

Insomma cerco qualcuno che mi sappia aiutare perchŔ io proprio :master: :bh˛: :dh˛:
Grazie, aspetto notizie :zizi:

Massimo

Loading