Newsgroup: it.comp.lang.c
Titolo: Ma perchè???

Salve a tutti.....spero qualcuno che qualcuno di voi, mi possa aiutare
a capire dov'è il problema in questo programma.....in pratica data una
lista di interi, devo eliminare da essa alternativamente un dispari e
un pari, modificando questa lista.Il codice è il seguente, ma non mi
ritorna niente, e non capisco il perchè!!!
#include<stdio.h>
#include<stdlib.h>
struct lista{
int d;
struct lista *next;
};
typedef struct lista LISTA;
typedef LISTA *LISTAPTR;
void enqueue(LISTAPTR *t, LISTAPTR *c, int val){
    LISTAPTR newPtr=NULL;
    newPtr=malloc(sizeof(LISTA));
    newPtr->d=val;
    newPtr->next=NULL;
         if(*t==NULL){
           *t=newPtr;
           *c=newPtr;
         }else{
           (*c)->next=newPtr;
           *c=newPtr;
         }
}
void Elimina(LISTAPTR *t){
int i=1;
LISTAPTR temp;
temp= *t;
while (*t != NULL){
	if(i % 2 != 0){
		if ((*t)->d %2 != 0)
			{
			temp= (*t);
			temp = temp->next;
			free(temp);
			(*t)=temp;
		i++;}
      else (*t)= (*t)->next;
	printf("%d", i);	}
	else if (i % 2 == 0){
		if ((*t)->d %2 == 0)
			{
			temp= (*t);
			temp = temp->next;
			free(temp);
			(*t)=temp;
		i--;}
else (*t)= (*t)->next;
		}
}return;
}
main(){
  LISTAPTR testa=NULL, testa2=NULL, coda=NULL, corr=NULL;
  int n, i, dato;
  scanf("%d", &n);
  i=0;
  while(i<n){
    scanf("%d", &dato);
    enqueue(&testa, &coda, dato);
    i++;
    }
  Elimina(&testa);
  corr=testa;
 while(corr != NULL){
printf("%d", corr ->d);
corr= corr->next;
  }
  return 0;
}
Dove sbaglio??
Aiutatemi please!!!

 			(*t)=temp;
Queste righe sono equivalenti a
	free((*t)->next);
che ti lascia la lista "appesa".
Cosa volevi ottenere invece? Se vuoi eliminare il primo elemento dalla 
lista *t devi fare:
	temp=*t;
	*t=temp->next;
	free(temp);
	temp=0;
E.


In pratica, data una lista in input, devo eliminare, la prima
occorrenza di un valore dispari,
la seconda di un pari, la terza di un dispari e così via......non devo
eliminare solo il primo elemento.....

 eliminare solo il primo elemento.....
Ti chiedevo qual'č il significato di quelle quattro righe di codice, non 
  dell'intero programma!
E.

 E.
Sarebbero per sfilare il nodo, ma ho appena capito che eran
sbagliate...
sostituendole con le tue, già mi ritorna dei valori.....ma non
completamente corretti......perchè??
Scusa le domande forse banali, ma sto usando i puntatori e liste da
poco....


Mi correggo....non stampa ancora niente in output!!!

       else (*t)= (*t)->next;
Qui probabilmente intendevi fare:
	t= &((*t)->next);
E.

		i++;}
Questo pezzo di codice e' sbagliato sicuramente, fermo restando che
non sono riuscito a capire cosa volevi fare.
In questo pezzo di codice prelevi il puntatore della lista , lo
modifichi facendolo puntare all'item successivo ( e non fai neanche il
controllo per vedere se e' NULL. Dopo di che fai la free dell'item
puntato dalla variabile temp e riassoci temp stesso a t, ovvero ad un
aera appena deallocata. Al ciclo successivo appena punti con il
puntatore t il programma crepa come un cane, per quello non ti scrive
nulla. Per seguire il programma consigli sembre l'utilizzo del
debugger ... 


E' comunque, se non hai vincoli, per gestire una lista di questo tipo
( fatta con i puntatori ) e hai necessita' di cancellare item,, e'
molto meglio utilizzare le liste doppiamente llinkate, ovvero quelle
che hanno sia il puntatore next all'item successivo, che un puntatore
previous che punta all'item precedente. Per cancellare un item
centrale basta puntarsi all'item e modificare il puntatore next
dell'item precedente e il puntatore previous dell'item successivo, in
questo modo hai "ricucito" la lista, dopo di che fai la free dell'item
che devi cancellare. Spero di esserti stato d'aiuto