Questo é il programma, l'esercizio chiede la creazione di una funzione SeparaMedia che calcola laedia degli elementi della lista e chiede una nuova lista con solo gli elementi maggiori della media eliminandoli dalla vecchia lista.
Il programma funziona togliendo le parti scritte per cancellare gli elementi, ma la lista vecchia poi rimane invariata e non va bene, aiutoo
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct nodo {
int info;
struct nodo *next;
};
typedef struct nodo Nodo;
typedef Nodo* PNodo;
void inserisciInTesta(PNodo *l, int el)
{
PNodo temp;
temp = (PNodo) malloc(sizeof(Nodo));
temp->info = el;
temp->next = *l;
*l=temp;
}
PNodo crea_lista(int s)
{
Nodo *inizio; // o alternativamente PNodo inizio;
int i, n;
inizio = NULL;
srand(time(NULL));
for (i=0; i<s; i++)
{
n=1 + rand()%100;
inserisciInTesta(&inizio,n); //o inizio=inserisciInTestaA(inizio,n);
}
return(inizio);
}
void stampa_lista(PNodo p)
{
while (p != NULL)
{
printf("%d --> ", p->info);
p = p->next;
}
printf("NULL\n");
}
void SeparaMedia(PNodo l)
{
int el, c = 0; // Initialize count
int somma = 0;
double media = 0.0;
PNodo s1,s2, s3,corr,temp;
s1 = l;
s2 = l;
while (s1!= NULL)
{
c++;
somma =somma + s1->info;
s1 = s1->next;
}
media = (double)somma/c;
printf(" la media degli elementi della lista e':%lf\n", media);
s3 = NULL; //head of list, restituiamo questo per stampare
corr = s3;
while(s2!=NULL)
{
if((s2->info)<= media)
{printf("non aggiungo %d \n", s2->info);
}
else{
if ((s3 == NULL) && ((s2->info)>media))
{
printf("elimino questo elemento:%d \n ", s2->info);
PNodo new = malloc(sizeof(PNodo));
new->info = s2->info;
new->next = NULL;
s3 = new;
corr = new;
temp=l;
l=l->next;
free(temp);
// questo scorrerà con la lista, s3 rimarrà alla head della lista
}
else
if(s2->next!=NULL) {
if(s2->next->info>media)
{
}
{
PNodo new = malloc(sizeof(PNodo));
new->info = s2->info;
new->next = NULL;
corr->next = new;
corr = new;
if((s2->info)>media) {
temp=s2->next;
s2->next=s2->next->next;
free(temp);}
}
}
}
s2 = s2->next;
}
printf("lista nuova:\n");
stampa_lista(s3);
}
int main ()
{
PNodo pstart = NULL;
int s;
double avg;
printf("Quanti elementi vuoi inserire nella lista?: ");
scanf("%d",&s);
printf("\n\n Ecco una lista di %d interi random: \n\n ",s);
pstart=crea_lista(s);
stampa_lista(pstart);
SeparaMedia(pstart);
stampa_lista(pstart);
}