Corso di Informatica Generale - Primo modulo IN1

Testi e soluzioni di 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(1);
}

Per informazioni e commenti: liverani@mat.uniroma3.it - Torna alla Home page - Ultima modifica: 2 Maggio 2001