Gli esercizi
Testi e soluzioni di alcuni esercizi
Eliminazione nodi da una lista
/*
**  elimina_dispari.c
**
**  Letta in input una sequenza di numeri interi la memorizza
**  su una lista. Elimina dalla lista tutti gli elementi dispari.
**
**  Marco Liverani (liverani@mat.uniroma3.it) - Aprile 2001
**
*/
#include <stdlib.h>
#include <stdio.h>
/*
 * struttura per la rappresentazione dei nodi della lista
 */
struct nodo {
  int 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;
  int i, n, x;
  primo = NULL;
  printf("Numero di elementi: ");
  scanf("%d", &n);
  for (i=0; i < n; i++) {
    scanf("%d", &x);
    p = malloc(sizeof(struct nodo));
    p->info = x;
    p->next = primo;
    primo = p;
  }
  return(primo);
}
/*
 * Elimina dalla lista tutti i nodi con valore dispari.
 * Restituisce il puntatore al primo elemento della lista.
 */
struct nodo *elimina_dispari(struct nodo *primo) {
  struct nodo *p, *prec;
  p = primo;
  prec = NULL;
  while (p != NULL) {
    printf("%d\n", p->info);
    if (p->info % 2 != 0) {
      if (p == primo) {
        primo = primo->next;
        free(p);
        p = primo;
      } else {
        prec->next = p->next;
        free(p);
        p = prec->next;
      }
    } else {
      prec = p;
      p = p->next;
    }
  }
  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("%d ---> ", p->info);
    p = p->next;
  }
  printf("NULL\n");
  return;
}
/*
 * Funzione principale.
 */
int main(void) {
  struct nodo *primo;
  primo = leggi_lista();
  primo = elimina_dispari(primo);
  stampa_lista(primo);
  return(0);
}