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:

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:
Grazie, aspetto notizie

Massimo