Sto scrivendo una libreria sulle operazioni principali che si fanno sulle liste, ma ho un problema con l'inserimento in coda... quando arriva all'inserimento in coda crasha il programma e non riesco a capire perchè... posto il codice intero così se qualcuno ha 2 minuti può provarlo direttamente... grazie in anticipo

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

// definizione della struttura per la lista
struct nodolista
{
    int Info;
    struct nodolista *Next;
};
typedef struct nodolista LISTA;

// inizializza il primo elemento della lista a NULL
void Crea(LISTA **Head);

// inserisce un elemento in testa alla lista
void InserisciTesta(LISTA **Head, int val);

// inserisce un elemento in coda alla lista
void InserisciCoda(LISTA **Head, int val);

// stampa la lista
void Stampa(LISTA *Head);

// dealloca la memoria allocata per la struttura "LISTA"
void Dealloca(LISTA **Head);

main()
{
    LISTA *Head;
    int i, N, valore;

    Crea(&Head);
    printf("Quanti elementi vuoi inserire nella lista? ");
    scanf("%i", &N);
    for (i=0; i<N; i++) {
        printf("Inserisci l'elmento [%i]: ", i+1);
        scanf("%i", &valore);
        InserisciTesta(&Head,valore);
    }
    Stampa(Head);
    printf("Inserisci l'elmento da inserire in coda: ");
    scanf("%i", &valore);
    InserisciCoda(&Head,valore);
    Stampa(Head);
    Dealloca(&Head);
    system("pause");
}

// inizializza il primo elemento della lista a NULL
void Crea(LISTA **Head)
{
    *Head=NULL;
}

// inserisce un elemento in testa alla lista
void InserisciTesta(LISTA **Head, int val)
{
    LISTA *Temp, *Next;

    Next=*Head;
    Temp=(LISTA *)malloc(sizeof(LISTA));
    Temp->Info=val;
    Temp->Next=Next;
    *Head=Temp;
}

// inserisce un elemento in coda alla lista
void InserisciCoda(LISTA **Head, int val)
{
    LISTA *Temp,*Tail;

    Temp=(LISTA *)malloc(sizeof(LISTA));
    Temp->Info=val;
    Temp->Next=NULL;
    if (*Head=NULL) {
        *Head=Temp;
    }
    else {
        Tail=*Head;
        while (Tail->Next) {
            Tail=Tail->Next;
        }
        Tail->Next=Temp;
    }
}

// stampa la lista
void Stampa(LISTA *Head)
{
	int i;

	if (Head==NULL) {
		printf("Errore: Impossibile Stampare, Lista Vuota\n");
	}
	else {
		printf("Lista:\n");
		while(Head!=NULL) {
			printf("%d -> ", Head->Info);
			Head=Head->Next;
		}
		printf("NULL\n");
	}
}

// dealloca la memoria allocata per la struttura "LISTA"
void Dealloca(LISTA **Head)
{
	LISTA *Temp;

	while ((*Head)!=NULL)
	{
		Temp=*Head;
		(*Head)=(*Head)->Next;
		free(Temp);
	}
}