Salve a tutti, ho implementato una funzione che data in ingresso una lista ordinata restituisce la lista senza i nodi che contengono i numeri pari al suo interno.In sostanza la funzione itera tramite un while e appena trova un elemento dispari nel nodo lo elimina.La stuttura interna si divide in due casi, la cancellazione in testa e quella non in testa alla lista.
Quando chiamo la funzione oltre ai valori corretti mi stampa anche dei valori casuali e non riesco a capire il perchè.
Posto il codice della funzione.
codice:Tipo_lista cancella_tutti_pari(Tipo_lista l) { Tipo_lista Prec, Succ; Prec = NULL; Succ = l; if (Succ == NULL) return l; while (Succ != NULL) { if (Succ->Value %2 == 0) { Tipo_lista Temp = NULL; if (Prec == NULL) { Temp = l; l = Succ->Next; free(Temp); } else { Temp = Succ; Succ = Succ->Next; free(Temp); } } else { Prec = Succ; Succ = Succ->Next; } } return l; }
posto anche la definizione della stuttura, i prototipi, il main e le altre due funzioni di stampa e di inserimento.
codice:#include <stdio.h> #include <stdlib.h> // definizione della struttura struct Tag_nodo { int Value; struct Tag_nodo *Next; }; typedef struct Tag_nodo Tipo_nodo; typedef Tipo_nodo *Tipo_lista; // prototipi delle funzioni Tipo_lista insert(Tipo_lista l, int val); Tipo_lista cancella_tutti_pari(Tipo_lista l); void stampa(Tipo_lista l); //main int main() { Tipo_lista l = NULL; l = insert(l, 3); l = insert(l, 6); l = insert(l, 8); l = insert(l, 5); l = insert(l, 12); stampa(l); l = cancella_tutti_pari(l); stampa(l); system("PAUSE"); return 0; } Tipo_lista insert(Tipo_lista l, int val) { if ((l == NULL) || (l->Value > val)) { Tipo_lista Temp; Temp = (Tipo_lista)malloc(sizeof(Tipo_nodo)); if (Temp == NULL) { printf("Errore di allocazione nodo nella memoria"); exit(1); } Temp->Value = val; Temp->Next = l; return Temp; } else { l->Next = insert(l->Next, val); return l; } } void stampa(Tipo_lista l) { if (l == NULL) printf("Lista vuota\n"); else { while ( l != NULL) { printf("%d\n", l->Value); l = l->Next; } } }
grazie

Rispondi quotando
