Corso di Informatica Generale - Primo modulo IN1

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

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