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