Newsgroup: it.comp.lang.c
Titolo: Problemino con liste...

Salve a tutti,
il seguente programmino (volevo esercitarmi un po' con le liste) deve 
costruire una lista utilizzando i puntatori, con i valori inseriti 
dall'utente. Inserendo 0 viene terminata la lista.
Memorizzata la lista devono essere eliminati gli elementi pari 
all'interno della lista.
Ma quando vado a stamparla, al posto dell'elemento eliminato mi stampa 
un numero strano e poi 0...
Mah!
Questo e' il codice cmq:
#include <stdio.h>
#include <stdlib.h>
struct elem {
	int inf;
	struct elem *pun;
};
int main (void){
	int pari=0, dis=0, var;
	struct elem *paus, *p, x, *pf;
	printf ("Inserisci elemento: ");
	scanf ("%d", &x.inf);
	if (x.inf!=0){
		p=(struct elem *)malloc (sizeof(struct elem));
		pf=paus=p;
		paus->inf=x.inf;
		while (x.inf!=0){
			printf ("Inserisci elemento: ");
			scanf ("%d", &x.inf);
			paus->pun=(struct elem *)malloc(sizeof(struct elem));
			paus=paus->pun;
			paus->inf=x.inf;
		}
		paus->pun=NULL;
	}
	//Elimina gli elementi pari
	while (p!=NULL){
		if (!(p->inf%2)){
			pari++;
			paus=p;
			p=p->pun;
			free(paus);
			printf ("IF\n");
		}
		else{
			dis++;
			p=p->pun;
			printf ("ELSE\n");
		}
	}
	//Stampa la nuova lista
	while (pf!=NULL){
		printf ("Stampa\n");
		printf ("%d--->", pf->inf);
		pf=pf->pun;
	}
	return 0;
}
-- 
"L'Italia sta marcendo in un benessere che e' egoismo, stupidita', 
incultura, pettegolezzo,
moralismo, coazione, conformismo: prestarsi in qualche modo a 
contribuire a questa marcescenza
e', ora, il fascismo."
Pier Paolo Pasolini, 1972

 inseriti dall'utente. Inserendo 0 viene terminata la lista.
#include <stdio.h>
#include <stdlib.h>
#define ALLOCA(p) if(!((p)=(struct elem *)malloc(sizeof(struct 
elem)))){fputs("Errore di allocazione\n", stderr); return 1;}
struct elem {
        int inf;
        struct elem *pun;
};
int main (){
        int pari=0, dis=0, var;
        struct elem *p, *paus, *pd, *pprec;
        ALLOCA(p)
         for(paus=p;;paus=paus->pun){
                printf ("Inserisci elemento: ");
                scanf ("%d", &paus->inf);
                printf("%p", paus);
                if(!paus->inf) break;
                putchar('-');
                ALLOCA(paus->pun)
                printf("%p ; %d", paus->pun, paus->inf);
        }
        putchar('2');
        paus->pun=NULL;
        printf("1");
        for(pprec=paus=p; paus;){
                printf("%p", paus);
                if (!(paus->inf % 2)){
                        pari++;
                        pd=paus;
                        paus=paus->pun;
                        free(pd);
                        if(pd==p){
                                pprec=p=paus;
                                continue;
                        }
                        pprec->pun=paus;
                        printf("IF");
                }
                else{
                        dis++;
                        printf ("%d--->", paus->inf);
                        paus=paus->pun;
                        printf("ELSE");
                }
        }
        paus->pun=NULL;
        for(pd=p;p; p=p->pun){
                pd=p;
                free(pd);
        }
        return 0;
}
Prova con questo. Alle prime esecuzioni andava tutto bene, poi ha 
iniziato a coredumpare ogni volta che immettevo uno zero. Ho messo 
delle printf nel primo for per cercare di capire il problema, ma 
`paus' veniva "incrementato" correttamente. Bah.
Morale: il problema non l'ho trovato, se lo trovate fatemelo sapere.
Saluti
-- 
Per l'e-mail rimuovere la frase in maiuscolo e gli underscore.

 }
Qua devi collegare il nodo precedente a p con quello successivo, "saltando"
quindi p.
Per far cio' ti dovrai portare dietro il puntatore al precedente e gestire i
casi particolari tipo quello di inizio lista (che non ha un precedente!)
Ciao,
Ema