Salve ragazzi,sapete il perchè mi compare questo errore in questo programma ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <malloc.h>
struct listNode{
	
	char data;
	 struct listNode *nextPtr;
	
	
};
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
//prototipi
void inserisci(ListNodePtr *sPtr, char valore);
char elimina(ListNodePtr *sPtr, char valore);
int vuota(ListNodePtr sPtr);
void stampaLista (ListNodePtr attualePtr);
void istruzioni (void);
int main(void)
{
	ListNodePtr startPtr= NULL; // all'inizio non ci sono nodi
	char carattere;//char inserito dall'utente
	istruzioni();//stampa il menu
	printf("%s","? ");
	unsigned int scelta;//scelta dell'utente
	scanf("%u",&scelta);
	
	//ripeti il ciclo finchè l'utente non sceglie 3
	
	while(scelta!=3){
		
		switch(scelta){
			
			case 1:
				printf("%s","Inserisci un carattere:");
				scanf("\n%c",&carattere);
				inserisci(&startPtr,carattere);//inserisci l'elemento nella lista
				stampaLista(startPtr);
				break;
				
			case 2://cancella un elemento
			if(!vuota(startPtr)){
				
				printf("%s","Inserisci carattere da eliminare: ");
				scanf("\n%c",&carattere);
				
				
				//se il carattere viene trovato, rimuovilo
				if(elimina(&startPtr,carattere)){
					
					printf("%c eliminato.\n",carattere);
					stampaLista(startPtr);
				}
				
				else{
					printf("%c non trovato.\n\n",carattere);
					
					
				}
					
			
		    }
			
			else{
				
				puts("lista vuota.\n");
				
				
			}
			
			break;
			default:
				puts("scelta non valida.\n");
				istruzioni();
				break;
			
			
		}
		printf("%s","? ");
		scanf("%u",&scelta);
		
	}
	
	puts("FINE");
	
	
	
}
//stampa le istruzioni all'utente
void istruzioni(void)
{
puts("Inserisci una scelta:\n"
" 1 per inserire un elemento nella lista\n"
" 2 per eliminare un elemento dalla lista\n"
" 3 per uscire.");
}
void inserisci(ListNodePtr *sPtr, char valore)
{
	ListNodePtr newPtr= malloc(sizeof(ListNode));
	if(newPtr!=NULL){//Se c'è spazio disponibile
		
		newPtr-> data=valore;//inserisci valore nel nodo
		newPtr->nextPtr = NULL;//il nodo non è collegato ad altri nodi
		
		
		ListNodePtr primaPtr=NULL;
		ListNodePtr attualePtr= *sPtr;
		
		
		//ripeti il ciclo per trovare la posizione corretta nella lista
		while(attualePtr!=NULL && valore > attualePtr->data){
			
			primaPtr=attualePtr;//va avanti....
			attualePtr=attualePtr->nextPtr;//..al nodo successivo
	
		}
		
		 //inserisci il nuovo nodo all'inizio della lista
		 
		 if(primaPtr== NULL){
		 	
		 	newPtr->nextPtr= *sPtr;
		 	*sPtr =newPtr;
		 }
		else {
			primaPtr->nextPtr=newPtr;
			newPtr->nextPtr=attualePtr;
		}
	}
	
	else{
		printf("%c non inserito.Memoria non disponibile.\n",valore);
	}
	
}
char elimina(ListNodePtr *sPtr, char valore)
{
	
	if(valore==(*sPtr)->data){
		
		ListNodePtr tempPtr= *sPtr;//aggancia il nodo da rimuovere
		*sPtr=(*sPtr)->nextPtr;//sfila il nodo
		free(tempPtr);//libera il nodo
		return valore;
	
	}
	else{
		
		
		ListNodePtr primaPtr = *sPtr;
		ListNodePtr attualePtr = (*sPtr)->nextPtr;
		
		
		while(attualePtr!=NULL && attualePtr->data!=valore){
			primaPtr=attualePtr;//va avanti...
			attualePtr=attualePtr->nextPtr;//...al nodo successivo
		}
		
		//cancella il nodo a cui punta currentPtr
		if(attualePtr !=NULL){
			ListNodePtr tempPtr = attualePtr;
			primaPtr->nextPtr=attualePtr->nextPtr;
			return valore;
			
			
		}
		
	}
	return '\0';
	
}
//restituisci 1 se la lista è vuota,altrimenti 0
void stampaLista (ListNodePtr attualePtr)
{
	
	//se la lista è vuota
	if(vuota(attualePtr)){
		
		puts("lista vuota.\n");
		
	}
	else{
		
		puts("La lista e':");
		
		//finchè non si raggiunge la fine della lista
		while(attualePtr !=NULL){
			
			printf("%c-->",attualePtr->data);
			attualePtr = attualePtr->nextPtr;
			
		}
		puts("NULL\n");
	}
		
}