Ciao ragazzi, ho implementato questo programma che legge dei numeri da un file e li salva in una lista in ordine decrescente, stampa i numeri che sono maggiori della media dei numeri presenti nel file e poi crea un file con solo i numeri maggiori a un numero dato da input. Queste tre funzioni del programma vengono gestite con un menu.
Il programma fa queste tre cose perfettamente, l'unica cosa che mi chiedo è come voler leggere la lista dei numeri più volte senza che questa venga accodata a quella che ho già caricato.
Cioè vorrei sapere come fare svuotare e riempire la lista ogni volta che voglio effettuare la scelta 1 del menu. Ho provato con qualche free() ma non so come implementare bene questa mia esigenza.
Qualcuno può aiutarmi?
Posto il codice per chiarezza:
#include<stdio.h>
#include<stdlib.h>
typedef struct numeri{
int num;
struct numeri *next;
}numeri;
numeri *inserisciOrdinati(numeri **ln, int num){
numeri *p=(numeri *)malloc(sizeof(numeri));
numeri *r,*q; //r=precedente , q=successivo
p->num=num;
p->next=NULL;
r=*ln;
q=*ln;
while(q!=NULL && q->num>p->num){
r=q;
q=q->next;
}
if(q==*ln){ //inserimento in testa
*ln=p;
}
else{ //inserimento in coda
r->next=p;
}
p->next=q;
return *ln;
}
void visualizzaOrdinati(numeri *ln){
numeri *elem;
elem=ln;
while(elem!=NULL){
printf("Numero: %d\n", elem->num);
elem=elem->next;
}
}
void visualizzaMedia(numeri *ln){
int totale=0, index=0;
float media;
numeri *elem, *elem2;
elem=ln;
while(elem!=NULL){
totale=elem->num +totale;
elem=elem->next;
index++;
}
printf("La somma totale dei numeri della lista e': %d\n", totale);
media=(float) totale/index;
printf("La media dei numeri e' %f\n", media);
elem2=ln;
printf("La lista dei numeri minori della media e': \n");
while(elem2!=NULL){
if(elem2->num<media)
printf("%d\n", elem2->num);
elem2=elem2->next;
}
}
void visualizzaFileMaggiori(numeri *ln){
char filename[30];
FILE *fp2;
printf("Inserisci il nome che vuoi dare al file: ");
scanf("%s", filename);
fp2=fopen(filename, "w");
numeri *elem;
int n;
printf("Inserisci un numero: \n");
scanf("%d", &n);
elem=ln;
while(elem!=NULL){
if(elem->num>n)
fprintf(fp2,"%d\n", elem->num);
elem=elem->next;
}
fclose(fp2);
}
int main(){
int num, scelta;
numeri *ln, *elem;
FILE *fp;
ln=NULL;
do{
printf("1-Visualizza la lista dei numeri in ordine decrescente\n");
printf("2-Visualizza gli elementi minori della media\n");
printf("3-Salva in un file gli elementi maggiori di un numero dato\n");
printf("0-ESCI\n\n");
scanf("%d", &scelta);
fflush(stdin);
switch(scelta){
case 1:
if((fp=fopen("numeri.txt", "r"))==NULL){
printf("Il file non esiste\n");
exit(1);
}
else{
while(!feof(fp)){
fscanf(fp, "%d\n", &num);
ln=inserisciOrdinati(&ln, num);
}
fclose(fp);
visualizzaOrdinati(ln);
}
break;
case 2:
visualizzaMedia(ln);
break;
case 3:
visualizzaFileMaggiori(ln);
break;
default:printf("La scelta che hai inserito non e' corretta\n");
break;
}
}while(scelta!=0);
}