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