Salve a tutti ho realizzato una funzione che ricorsivamente cancella tutti i nodi di una lista multipli di tre ricevuta in input.La funzione restituisce la lista modificata e riceve anche una variabile di tipo puntatore che dovrebbe tenere traccia del numero di nodi cancellati.La funzione che ho realizzato sulla lista opera perfettamente ma non riesce a tenere traccia del numero di nodi cancellati.Come potrei implementare l'uso della vbariabile ?
le limitazioni sono che, non posso modificare il main, ne definire una var globale, e non posso modificare i parametri in input e output della funzione, sono il suo contenuto.
la funzione:
codice:Tipo_lista elimina_multipli_tre_ric(Tipo_lista l, int *n) { if (l == NULL) { *n = 0; return NULL; } if (l->Next == NULL) { if (l->Value % 3 == 0) { *n = *n+1; free(l); return NULL; } else { *n = 0; return l; } } else { if (l->Value %3 == 0) { *n = *n+1; Tipo_lista temp; temp = l; l = l->Next; free(temp); l = elimina_multipli_tre_ric(l, n); return l; } else { l->Next = elimina_multipli_tre_ric(l->Next, n); return l; } } }
il resto del programma:
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_ric(Tipo_lista l, int val); int conta_nodi_ric(Tipo_lista l); Tipo_lista elimina_multipli_tre_ric(Tipo_lista l, int *n); void stampa_ric(Tipo_lista l); int inserisci_in_stack(int numero, int stack[],int sp); void stampa_stack(int stack[], int sp); //main int main() { Tipo_lista l = NULL; int n; int sp = 0; int stack[10]; l = insert_ric(l, 3); l = insert_ric(l, 6); l = insert_ric(l, 8); l = insert_ric(l, 5); l = insert_ric(l, 12); l = insert_ric(l, 4); printf("\n\n"); stampa_ric(l); printf("\nLa lista contiene %d nodi\n\n", conta_nodi_ric(l)); l = elimina_multipli_tre_ric(l, &n); sp = inserisci_in_stack(n, stack, sp); printf("\nsp = %d\n", sp); printf("\nn = %d\n\n", n); stampa_ric(l); stampa_stack(stack, sp); system("PAUSE"); return 0; } // Funzioni Tipo_lista insert_ric(Tipo_lista l, int val) { if ((l == NULL) || (l->Value > val)) // se la lista è vuota o l'inserimento è in testa { 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_ric(l->Next, val); return l; } } int conta_nodi_ric(Tipo_lista l) { if (l == NULL) return 0; else return conta_nodi_ric(l->Next) + 1; } void stampa_ric(Tipo_lista l) { if (l == NULL) return; else { printf("%d\n", l->Value); stampa_ric(l->Next); } } int inserisci_in_stack(int numero, int stack[],int sp) { stack[sp] = numero; sp = sp + 1; return sp; } void stampa_stack(int stack[], int sp) { int i; printf("\nElementi dello stack\n"); for (i=sp-1; i>=0; i--) printf("%d\n", stack[i]); }
grazie a tutti![]()

Rispondi quotando
