Ciao a tutti,dovrei implementare una funzione che dopo aver fatto l'inserimento in lista,calcola la media e il mediano della lista,cioè quell'elemento che ha una differenza tra il numero di maggioranti e minoranti <=1. I maggioranti sono tutti gli elementi con valore >=rispetto all'elemento in esame,mentre i minoranti sono quelli che hanno un valore <= dell'elemento.
La mia idea era quella di prendere il primo elemento della lista in esame,contare tutti i suoi maggioranti,tutti i suoi minoranti e se la differenza è <=1 l'ho trovato,altrimenti rifaccio la stessa cosa con il secondo elemento della lista e cosi via fino alla fine.
L'inserimento della lista,la stampa e il calcolo della media sono ok,però quando calcola il mediano il programma si punta. Dove sbaglio???
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct list{ //definizione lista
int info;
struct list *nextptr;
}list;
/*******************dichiarazione delle funzioni*****************************/
void inserisci(list **listptr,int value);//inserisce in testa
void print_list(list*listptr);//stampa lista
void elaboralista(list*lp,float*,int*);//ritorna media e mediano
/****************************main****************** *******************/
int main(int argc, char *argv[])
{
int value;
int scelta;
int mediano=0;
float media=0;
list *listptr=NULL;
do {
printf("\n cosa vuoi fare: \n 1)inserire in testa\n 2)stampa lista");
printf("\n 3)calcola media e mediamo\n 0) per terminare");
scanf("%d",&scelta);
switch (scelta)
{
case 1rintf("\n digita il valore da mettere in testa-->");
scanf("%d",&value);
inserisci(&listptr,value);
break;
case 2rint_list(listptr);
break;
case 3:elaboralista(listptr,&media,&mediano);
printf("\n media= %f -- mediano=%d ",media,mediano);
break;
}
}
while (scelta!=0);
system("PAUSE");
return 0;
}
/***********************inserimento in testa*******************************/
void inserisci(list **listptrptr,int value)
{
list*tmpptr;
tmpptr=(list*)malloc(sizeof(list));
tmpptr->info=value;
tmpptr->nextptr=(*listptrptr);
(*listptrptr)=tmpptr;
return ;
}
/****************************stampa**************** *******************/
void print_list(list *listptr)
{ printf("\n lista:");
do
{
printf("--> %d ",listptr->info);
listptr=listptr->nextptr;
}
while(listptr->nextptr!=NULL);
printf("-->%d",listptr->info);
return;
}
/*************calcola media e mediano**********************************/
void elaboralista(list*lp,float*media,int*mediano)
{
list*tmp=NULL;
list *tmp2=NULL;
float somma=0;
int count=0; //conta elementi
int upper,lower;//conta i maggioranti e minoranti
tmp=lp;//salvo testa lista
while(lp!=NULL)
{
count++;
somma+=lp->info;
lp=lp->nextptr;
}
(*media)=(somma/count);
printf("\nmedia=%f",somma/count);
lp=tmp;//ricopio testa
tmp2=lp;//salvo testa
while(lp!=NULL)
{
tmp=lp;
upper=0;
lower=0;
while(tmp!=NULL)
{
if(tmp->info>=lp->info) //l'elemento in esame cioè tmp->info
upper++; // è maggiorante di lp->info
if(tmp->info>=lp->info) //l'elemento in esame cioè tmp->info
lower++; // è minorante di lp->info
tmp=tmp->nextptr;//scorro tutta la lista
}
if(abs(upper-lower)<=1)//se la diff tra il numero di maggioranti e quello
//dei minoranti è <=1 lp->info è un mediano
(*mediano)=lp->info;
else
lp=lp->nextptr;//prendo in esame il candidato successivo
}
lp=tmp2;
return;
}
/************************************************** ****************************/