Salve !
Il professore di linguaggio C ci ha chiesto di completare e correggere un esempio di lista di nodi. Riscontro un problema quando intendo rimuovere il nodo testa, verificandosi un problema di puntatori. Il codice è questo :

codice:
#include <stdio.h>
#include <stdlib.h>



typedef struct nodolista
{
  int KEY;
  struct nodolista *next;
} nodolista;


nodolista* aggiungiintesta(int key, nodolista*);
void visualizzalista(nodolista*);
void rilascianodo(nodolista*);



int main()
{
  nodolista *testa;
  testa = calloc(1, sizeof(nodolista));
  testa = aggiungiintesta(3, testa);
  printf("\n");
  visualizzalista(testa);
  testa = aggiungiintesta(2, testa);
  printf("\n");
  visualizzalista(testa);
  testa = aggiungiintesta(1, testa);
  printf("\n");
  visualizzalista(testa);
  printf("\n");
  rilascianodo(testa);
  visualizzalista(testa);
  
  system("PAUSE");
  return 0;
}



nodolista* aggiungiintesta(int key, nodolista *testa)
{
  nodolista *ptr;
  ptr = calloc(1, sizeof(nodolista));
  
  if(ptr == NULL)
  {
     printf("Memoria insufficiente !\n");
     return NULL;
  }
  
  ptr -> next = testa; //ptr[val|pun ---> testa
  testa = ptr;
  ptr -> KEY = key;
  return ptr;
}



void rilascianodo(nodolista* ptr)
{
  nodolista *p;
  p = calloc(1, sizeof(nodolista));
  
  while(ptr)
  {
    p = ptr -> next;
    free(ptr);
    ptr = p;
  }
}



void visualizzalista(nodolista* ptr)
{
   while(ptr)
   {
   	 printf("[%d]", ptr -> KEY);
   	 if(ptr -> next != NULL)
     	printf(" ---> ");
     ptr = ptr -> next;
   }
}
Potete cortesemente aiutarmi a fixare l' errore ?
Grazie in anticipo !