Ciao, ho un problema con questo codice, ho passato ore a capire dove sbaglio ma non trovo nulla di strano o sbagliato. Praticamente stavo calcolando la media, tramite la funzione void media_positivi, solamente dei valori positivi presenti nella lista, ma quando visualizzo a video la media mi esce il valore cosi:
Il codice è questo:
#include<stdio.h>
#include<stdlib.h>
typedef struct nodo {
int data;
struct nodo *next;
} nodo;
//prototipi
int lista_leggi_file(FILE *fp, nodo** testa);
void inserisci_in_coda(nodo** testa, int x);
void lista_visualizza(nodo* testa);
void media_positivi(nodo* testa, int* somma, float* media, int n);
int main(int argc, char *argv[]) {
if(argc!=2){
printf("\nErrore. Numero di argomenti sbagliato!\n");
return 1;
}
else{
FILE *fp = fopen(argv[1], "r");
nodo* lista = NULL;
if(fp!=NULL){
int nodi = 0; //nodi letti
int somma = 0;
float media = 0;
int nodi_positivi = 0;
nodi = lista_leggi_file(fp, &lista);
printf("\nNumero di nodi creati:\t%d.\n", nodi);
lista_visualizza(lista);
printf("\n");
media_positivi(lista, &somma, &media, nodi_positivi);
return 0;
}
}
}
int lista_leggi_file(FILE *fp, nodo** testa){
int i = 0;
while(!feof(fp)){
int data;
int nb = fscanf(fp, "%d", &data);
if(nb>0){
inserisci_in_coda(testa, data);
i++;
}
}
return i;
}
void inserisci_in_coda(nodo** testa, int x){
nodo* newnode = (nodo*)malloc(sizeof(nodo));
nodo* last = *testa;
if(newnode!=NULL){
newnode->data = x;
newnode->next = NULL;
if(*testa==NULL){
*testa = newnode;
return;
}
while(last->next!=NULL){
last = last->next;
}
last->next = newnode;
}
else{
printf("\nErrore nella creazione del nodo.\n");
}
}
void lista_visualizza(nodo* testa){
if(testa==NULL){
printf("NULL");
return;
}
else{
printf(" %d -> ", testa->data);
return lista_visualizza(testa->next);
}
}
void media_positivi(nodo* testa, int* somma, float* media, int n){
if(testa==NULL){
*media = (float) *somma / n;
printf("\nMedia:\t %.2f", *media);
}
else{
if(testa->data>0){
*somma = *somma + testa->data;
return media_positivi(testa->next, somma, media, n++);
}
else{
return media_positivi(testa->next, somma, media, n);
}
}
}
Qualcuno sa perchè? Grazie