Gli esercizi
Testi e soluzioni di alcuni esercizi
Somma di sotto liste
/*
** sottoliste.c
**
** Letta in input una sequenza di numeri floating point la memorizza
** su una lista. Quindi stampa tutte le sotto-liste (prive di intersezione)
** in cui la somma degli elementi sia minore della media tra l'elemento massimo
** e minimo dell'intera lista.
**
** Marco Liverani (liverani@mat.uniroma3.it) - Maggio 2001
**
*/
#include <stdlib.h>
#include <stdio.h>
/*
* struttura per la rappresentazione dei nodi della lista
*/
struct nodo {
float info;
struct nodo *next;
};
/*
* Legge in input una sequenza di n interi e li memorizza su
* una lista. Restituisce il puntatore al primo elemento della lista.
*/
struct nodo *leggi_lista(void) {
struct nodo *p, *primo=NULL;
int i, n;
float x;
scanf("%d", &n);
for (i=0; i<n; i++) {
scanf("%f", &x);
p = malloc(sizeof(struct nodo));
p->info = x;
p->next = primo;
primo = p;
}
return(primo);
}
/*
* Stampa la lista partendo dall'elemento puntato dal
* puntatore p ricevuto come parametro.
*/
void stampa_lista(struct nodo *p) {
while (p != NULL) {
printf("%f --> ", p->info);
p = p->next;
}
printf("NULL\n");
return;
}
/*
* Restituisce il valore del massimo elemento della lista.
*/
float max(struct nodo *p) {
float m;
m = p->info;
while (p != NULL) {
if (m < p->info)
m = p->info;
p = p->next;
}
return(m);
}
/*
* Restituisce il valore del minimo elemento della lista.
*/
float min(struct nodo *p) {
float m;
m = p->info;
while (p != NULL) {
if (m > p->info)
m = p->info;
p = p->next;
}
return(m);
}
/*
* Calcola e stampa le sotto-liste in cui la somma degli
* elementi sia minore della media tra il massimo ed
* il minimo elemento dell'intera lista.
*/
void calcola(struct nodo *p) {
float media, somma;
media = (min(p) + max(p))/2.0;
somma = 0.0;
while (p != NULL) {
if (somma + p->info < media) {
somma = somma + p->info;
printf("%f ", p->info);
p=p->next;
} else {
printf("\n");
somma = 0.0;
if (p->info >= media)
p = p->next;
}
}
return;
}
/*
* Funzione principale.
*/
int main(void) {
struct nodo *primo;
primo = leggi_lista();
stampa_lista(primo);
calcola(primo);
return(0);
}