Svuotare lista[c]

di il
1 risposte

Svuotare lista[c]

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);
	
}

1 Risposte

  • Re: Svuotare lista[c]

    Per "svuotare" la lista, percorrila tutta a partire dal nodo iniziale, facendo la free del nodo corrente dopo aver conservato il puntatore al prossimo nodo. Puoi anche implementare un algoritmo ricorsivo, più elegante ma che impegna molte risorse.
Devi accedere o registrarti per scrivere nel forum
1 risposte