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