così a me va:

codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_LN  100

struct lista{
	char carattere;
	struct lista *next;
};

struct lista *StringToList(char *);
void stampalista(struct lista *);

int main(void){

	char stringa[MAX_LN];

	printf("Inserire una stringa: ");
	fgets(stringa,MAX_LN,stdin);
	stampalista(StringToList(stringa));
	getch();
	return 0;
}

struct lista *StringToList(char *s){
	
	struct lista *head = NULL;     // Crea il puntatore al primo nodo e impostalo a NULL
	struct lista *a;		     //	Puntatore a nodo generico
	int i;
	
	if(s[0] != '\0'){	     // Se il primo carattere della stringa non è nullo
		head = malloc(sizeof(struct lista));	// alloca memoria per il primo nodo della lista
		head->carattere = s[0];
		head->next = NULL;
		a = head;
	
		for(i=1; s[i] != '\0'; i++){
			a->next = malloc(sizeof(struct lista));
			a = a->next;
            a->carattere = s[i];
		}
	}
		a->next = NULL;		
		return(head);
	
}

void stampalista(struct lista *i){
		int counter = 0;
		while(i->next != NULL){
			printf("%c", i->carattere);
			i=i->next;
			counter ++;
		}//end while
printf("\nIl numero di nodi della lista corrisponde a: %d\n\n", counter);
}
poi si potrebbe fare di meglio eliminando l'if... però l'imp è che vada