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);
}