Ho modificato il codice iniziale, questo funziona.
Adesso penso sia istruttivo per te modificarlo e anziché utilizzare il ciclo per la scansione della lista, che aggiunge un elemento in coda, modifichi la lista mettendoci una struct con un puntatore alla testa e uno alla coda, modifichicando le funzioni di accesso in particolar modo quella relativa all'inserimento in coda.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLUN 41
typedef struct nodoL* listaN;
typedef struct nodoL {
char s[STRLUN];
listaN next;
} nodoL;
/** Prototipi delle funzioni */
int palindroma(char * );
/** Prototipi delle funzioni gestione lista */
listaN creaNodo(char * );
listaN AddLista(listaN , char * );
void StampaLista(listaN );
int main() {
printf("Inserire intero: ");
int n;
int i;
char str[STRLUN];
fgets(str, STRLUN, stdin);
n = atoi(str);
listaN P = NULL;
listaN N = NULL;
for(i=0; i<n; i++) {
printf("Inserire stringa: ");
fgets(str, STRLUN, stdin);
if(palindroma(str)==0)
P = AddLista(P, str);
else
N = AddLista(N, str);
}
printf("\nStringhe NON Palindrome\n");
StampaLista(N);
printf("\nStringhe Palindrome\n");
StampaLista(P);
return 0;
}
/** Definizioni delle funzioni */
int palindroma(char *s1) {
int l = strlen(s1);
char *s2 = malloc(l*sizeof(char *));
int j = l-2, i = 0;
strcpy(s2,s1);
while(s1[i]!='\0'&&j>=0) {
if(s1[i]!=s2[j])
return 1;
j--;
i++;
}
return 0;
}
/** Definizioni delle funzioni gestione lista */
listaN creaNodo(char * s1) {
int i;
listaN nodo = malloc(sizeof(*nodo));
for(i=0; s1[i]!='\0'; i++)
nodo->s[i] = s1[i];
nodo->next = NULL;
return nodo;
}
listaN AddLista(listaN lista, char *str) {
listaN t;
t = lista;
if(lista==NULL)
lista = creaNodo(str);
else {
while(t->next!=NULL)
t = t->next;
t->next = creaNodo(str);
}
return lista;
}
void StampaLista(listaN list) {
listaN p = list;
while(p!=NULL) {
printf("%s", p->s);
p = p->next;
}
return;
}