ciao!!!

prima di tutto devi cambiare la struttura

codice:
typedef struct WElem 
{
	char*			word;
	struct WElem* 	next;
} WElem, *WList;

in

typedef struct WElem 
{
	char  		        word[50];
	struct WElem* 	next;
} WElem, *WList;

e di conseguenza il main in:

..
        strcpy(X.word, "napoli");
	X.next = &Y;

	strcpy(Y.word, "livorno");
	Y.next = &W;

	strcpy(W.word, "hotel");
	W.next = &V;

	strcpy(V.word, "firenze");
	V.next = &Z;

	strcpy(Z.word, "dadada");
	Z.next = NULL;
...
a meno che tu non voglia occuparti anche dell'allocazione dello spazio per contenere le parole...

per il problema dell'ordinamento ho provato a buttare giù qualcosa vedi un po' se fa al caso tuo...

codice:
WList wl_sort(WList L) 
{
	WList sorgente = L; 
	WList destinazione = NULL;
	WList temp, temp1; 
	int trovato; 

	if(sorgente != NULL)
	{
		destinazione = (WList)malloc(sizeof(WElem));
		strcpy(destinazione->word, sorgente->word);
		destinazione->next = NULL;
		sorgente = sorgente->next;
		
		while(sorgente != NULL)
		{
			if(strcmp(sorgente->word, destinazione->word) < 0)
			{
				temp1 = (WList)malloc(sizeof(WElem));
				strcpy(temp1->word, sorgente->word);
				temp1->next = destinazione;
				destinazione = temp1;
			}
			else
			{
				temp1 = destinazione;
				trovato=0;
				while(temp1->next != NULL && trovato != 1)
					if(strcmp(temp1->next->word, sorgente->word) < 0)
						temp1 = temp1->next;
					else
						trovato = 1;
				
				temp = (WList)malloc(sizeof(WElem));
				strcpy(temp->word, sorgente->word);
				temp->next = temp1->next;
				temp1->next = temp;
			}
			sorgente = sorgente->next;
		}
	}

	return destinazione; 
}
All'interno del codice ci sono delle imperfezioni infatti quando effettui una allocazione dovresti controllare che l'allocazione sia andata a buon fine, ti devi ricordare di deallocare tutto prima che il programma termini ecc ecc...