Newsgroup: it.comp.lang.c
Titolo: Problemi con le liste concatenate

ciao a tutti, ho seri problemi con delle maledettissime liste che non
vogliono proprio ragionare...
praticamente ho realizzato una lista concatenata nella quale devo
inserire dei numeri reali (positivi e negativi) quando vado ad operare
alcune operazioni sui numeri inseriti (ad esempio somma oppure la
media) non funziona ovvero mi restituisce sempre come valore 0.0000, vi
do lo stralcio del codice:
#include <stdio.h>
#include <math.h>
struct listadati {
       float numero;
       struct listadati *datosuccPtr;};
typedef struct listadati Listadati ;
typedef Listadati *ListaPtr;
//prototipi
int insertscelta (void);
void insertconsole (ListaPtr*PrimoElem);
//void insertfile (FILE*inputdati, ListaPtr*PrimoElem);
void sottomenu (ListaPtr PrimoElemLista);
float fmedia (ListaPtr PrimoElemLista);
int numerocampioni (ListaPtr PrimoElemLista);
double fvarianza (ListaPtr PrimoElemLista);
double minimo (ListaPtr PrimoElemLista);
double massimo (ListaPtr PrimoElemLista);
double fpercentile (ListaPtr PrimoElemLista);
void ritornomenuprincipale (void);
void stampalista (ListaPtr PrimoElemLista);
int main() {
    ListaPtr PrimoPtr=NULL;     //all'inizio nn ci sono nodi
    int scelta;
    float media=0;
    FILE *inputdati;
    char siono;
    while ((scelta=insertscelta())!=8){
    switch (scelta)  {                             //Primo menù
           case 1:                               //Inserimento dati da
console
                insertconsole (&PrimoPtr);
                break;
           case 2:
               //inputdati = fopen( "datiinput.txt", "r");
               //insertfile(inputdati, &PrimoPtr);
               //fclose(inputdati);
               //break;
           case 3:
                  sottomenu(PrimoPtr);
                 break;
           case 4:
                media = fmedia(PrimoPtr);
                printf ("\n La media dei campioni in esame e' %lf\n ",
&media);
                break;
           case 5:
                stampalista(PrimoPtr);
                 break;
           default:
                printf("Scelta non corretta\n");
                fflush(stdin);
                break;
              }
              }
              printf ("\n Fine dell'esecuzione \n");
              system("PAUSE");
              }
int insertscelta (void){ //funzione per la scelta del menù
    int menu;
    printf(" Inserisci il numero corrispondente all'azione da
intraprendere\n");
    printf("\n 1 - Inserisci dati da console"
           "\n 2 - Inserisci dati da file "
           "\n 3 - Analisi Statistica dei dati"
           "\n 4 - Elimina un dato"
           "\n 5 - Stampa tutti i dati ordinati"
           "\n 6 - Stampa tutti i dati in 20 intervalli "
           "\n 7 - Salva i dati"
           "\n 8 - Termina il programma\n\n");
    scanf( "%d", &menu);
    return menu;}
void insertconsole (ListaPtr *PrimoElemPtr){
     ListaPtr nuovoPtr; //puntatore al nuovo nodo
     ListaPtr precedentePtr;
     ListaPtr correntePtr;
      double dato;
     printf("\n Inserisci un dato da console\n ");
     scanf(" %lf", &dato);
     nuovoPtr = malloc (sizeof (Listadati)); //crea il nodo
     nuovoPtr->numero = dato;
     nuovoPtr->datosuccPtr = NULL;
     precedentePtr = NULL;
     correntePtr = *PrimoElemPtr;
     // Ciclo per la ricerca della posizione corretta
     while ((correntePtr != NULL) && (dato > correntePtr->numero)){
     precedentePtr = correntePtr;
     correntePtr = correntePtr->datosuccPtr;
     }
     //inserisce il nuovo nodo all'inizio della lista
     if (precedentePtr == NULL){
        nuovoPtr->datosuccPtr = *PrimoElemPtr;
        *PrimoElemPtr = nuovoPtr;}
        else {//inserisce un nuovo nodo tra precedente e corrente ptr
        precedentePtr->datosuccPtr = nuovoPtr;
        nuovoPtr->datosuccPtr = correntePtr;
        }
        }
void sottomenu (ListaPtr PrimoElemPtr)
{
     int scelta, n;
     float media, somma, varianza, percentile, min, max;
     printf("\n Sceglie l'operazione Statistica da intraprendere:\n"
            "\n 1 - Media"
            "\n 2 - Numero di Campioni"
            "\n 3 - Minimo e Massimo"
            "\n 4 - Varianza "
            "\n 5 - Percentile"
            "\n 6 - Per tornare al menu' precedente");
    scanf ("\n %d" ,&scelta);
    switch (scelta){
           case 1:
                media = fmedia(PrimoElemPtr);
                printf ("\n La media dei campioni in esame e' %lf\n ",
&media);
                break;
           case 6:
                ritornomenuprincipale();
           default:
                   printf("Scelta non corretta\n");
                   break;
    }
}
float fmedia (ListaPtr PrimoElemLista) {
       float somma=0;
       float med;
       int contatore;
            if (PrimoElemLista == NULL){
                 printf ("\nNon sono stati immessi dati!!\n");
                 return 0;}
            else {
                 while (PrimoElemLista != NULL){
                 contatore++;
                 somma += PrimoElemLista->numero;
                 PrimoElemLista = PrimoElemLista->datosuccPtr;
                 printf ("che cazzo fai");
            med = (somma/contatore) ;
            printf("\n %lf\n", &somma);
            return med;}
            }
}
void ritornomenuprincipale (void)  {
     system ("CLS");
     insertscelta;}
void stampalista (ListaPtr PrimoElemLista)
{
     if (PrimoElemLista == NULL){
                        printf ("La Lista è vuota\n\n");
                        }
     else {
          printf ("I valori del campione sono:\n");
          while (PrimoElemLista != NULL){
                printf ("%lf \n", PrimoElemLista->numero);
                PrimoElemLista=PrimoElemLista->datosuccPtr;
                }
                }
                }
grazie in anticipo per la disponibilità

posta solo la parte che da problemi o dove pensi ci siano
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG