Salve ragazzi ho scritto un piccolo programma in c che deve leggere un intero N, leggere N stringhe e stampare in ordine di input prima le palindrome e dopo le restanti. non mi da errori a tempo di compilazione e al momento dell esecuzione mi da diversi risultati:
1) inanzitutto quando io ho inserito un intero mi stampa due volte la stessa cosa, così:"inserire una stringa...inserire una stringa", solo per la prima stringa che andrò ad inserire però! boooo;
2)se inserisco solo stringhe palindrome il programma funziona correttamente
3)se però come stringa inserisco "itopinonavevanonipoti " c'è l'errore segmentation fault(core dump);
4)se inserisco una stringa non palindroma, il programma si blocca immediatamente con l errore segmentation fault(core dump)
ho usato il debugger e dice che l'errore sta nella funzione AddPali, nella riga in cui nel while faccio "curr=curr->next" (solo nel case 3) però), sennò l'errore è nella funzione AddNorm quando faccio "prec->succ=newNorm".
qualcuno mi spiega cosa cè che non va?? Grazie.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
    char s[41];
    struct pali *next;
}pali;
typedef struct{
    char s[41];
    struct norm *succ;
}norm;
typedef struct pali* listaP;
typedef struct norm* listaN;
void StampaListaN(listaN);
void StampaListaP(listaP);
int palindroma(char*);
pali* creaPali(char*);
norm* creaNorm(char*);
listaP AddPali(listaP, char*);
listaN AddNorm(listaN, char*);
int main()
{
    printf("inserire intero...");
    int n=0;
    scanf("%d", &n);
    listaP P;
    listaN N;
    for(int i=0;i<n;i++){
        char str[41];
        printf("inserire stringa...");
        fgets(str,41,stdin);
        if(palindroma(str)==0){
            AddPali(P,str);
        }else{
            AddNorm(N,str);
        }
    }
    StampaListaN(N);
    StampaListaP(P);
    return 0;
}
int palindroma(char *s1){
    int l=strlen(s1);
    char *s2=malloc(sizeof(char *)*l);
    strcpy(s2,s1);
    int j=l-2;
    int i=0;
    while(s1[i]!='\0'&&j>=0){
        if(s1[i]!=s2[j]) {   //usare funziona compare string
        return 1;
        }
        j--;
        i++;
    }
    return 0;
}
pali * creaPali(char * s1){
    pali *ok=malloc(sizeof(pali *));
    for(int i=0;s1[i]!='\0';i++){
        ok->s[i]=s1[i];
    }
    ok->next=NULL;
    return ok;
}
norm * creaNorm(char * s1){
    norm *ok=malloc(sizeof(pali *));
    for(int i=0;s1[i]!='\0';i++){
        ok->s[i]=s1[i];
    }
    ok->succ=NULL;
    return ok;
}
listaP AddPali(listaP lista, char *str){
   pali *newPali, *prec, *curr;
   curr=lista;
   while(curr!=NULL){
        prec=curr;
        if(curr){
        curr=curr->next;
        }
   }
   newPali=creaPali(str);
   prec->next=newPali;
   return lista;
}
listaN AddNorm(listaN lista, char *str){
    norm * curr, *prec, *newNorm;
    curr=lista;
    while(curr!=NULL){
        prec=curr;
        if(curr) curr=curr->succ;
    }
    newNorm=creaNorm(str);
    prec->succ=newNorm;
    return lista;
}
void StampaListaP(listaP list){
    pali *p=list;
    while(p!=NULL){
        printf("%s", p->s);
        p=p->next;
    }
}
void StampaListaN(listaN list){
    norm *p=list;
    while(p!=NULL){
        printf("%s", p->s);
        p=p->succ;
    }
}