E sì ma io non so più aiutarti perchè è corretto, a me funziona.
Posso allegarti i file nuovamete.
Ti faccio se vuoi notare le differenze tra scrivere la struct nel .h e nel .c
client.c
#include <stdio.h>
#include <stdlib.h>
#include "esercizio.h"
int main() {
int i;
char *stringa,*a, *b;
LISTAPUNTATA lista;
stringa = (char *)calloc(100, sizeof(char));
a = (char *)calloc(100, sizeof(char));
b = (char *)calloc(100, sizeof(char));
lista=NULL;
//stringa="due";
stringa=leggi();
lista=inserimento(lista,stringa);
//stringa="amore";
stringa=leggi();
lista=inserimento(lista,stringa);
//stringa="ciao";
stringa=leggi();
lista=inserimento(lista,stringa);
//stringa="un";
stringa=leggi();
lista=inserimento(lista,stringa);
//printf("%s\n", lista->str); /* Attenta a questo */
system("PAUSE");
printf("La lista: \n");
stampa(lista);
printf("Inserisci x: ");
scanf("%d", &i);
a="un";
b="amore";
lista=cancellaparticolare(lista,i,a,b);
stampa(lista);
printf("\t\t*****FINE******\n");
system("PAUSE");
return 0;
}
esercizo.h
#ifndef ESERCIZIO_H_INCLUDED
#define ESERCIZIO_H_INCLUDED
typedef struct listapuntata * LISTAPUNTATA;
char * leggi (void);
LISTAPUNTATA inserimento(LISTAPUNTATA lista, char *elem);
void stampa(LISTAPUNTATA lista);
LISTAPUNTATA cancellatutto(LISTAPUNTATA lista);
LISTAPUNTATA cancella(LISTAPUNTATA lista, char *elem);
LISTAPUNTATA cancellaparticolare(LISTAPUNTATA lista, int x, char *a, char *b);
#endif // ESERCIZIO_H_INCLUDED
esercizio.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "esercizio.h"
typedef struct listapuntata {
char *str;
struct listapuntata *next;
}listapuntata;
char * leggi (void) {
char *s = (char *)malloc(80*sizeof(char));
printf("Introduci la stringa: ");
scanf ("%s",s);
return s;
}
LISTAPUNTATA inserimento(LISTAPUNTATA lista, char *elem) {
if((lista==NULL) || ((strlen(lista->str))>(strlen(elem)))) {
listapuntata *tmp=(listapuntata *)malloc(sizeof(listapuntata));
tmp->str=elem;
tmp->next=lista;
return tmp;
} else {
lista->next=inserimento(lista->next,elem);
return lista;
}
}
void stampa(listapuntata *lista) {
if (lista != NULL) {
printf(" %s\n",lista->str);
stampa(lista->next);
} else {
return;
}
}
listapuntata *cancellatutto(listapuntata *lista) {
if (lista!=NULL)
lista=cancellatutto(lista->next);
return lista;
}
listapuntata *cancella(listapuntata *lista, char *elem) {
int val;
if (lista!=NULL) {
val=strcmp((lista->str),elem);
if ( val!=0 ) {
lista->next=cancella(lista->next,elem);
} else if (val==0) {
printf("TROVATA\n");
listapuntata *tmp=(listapuntata *)malloc(sizeof(listapuntata));
tmp=lista;
lista=tmp->next;
free(tmp);
}
}
return lista;
}
listapuntata *cancellaparticolare(listapuntata *lista, int x, char *a, char *b) {
int lung;
if (lista!=NULL) {
lung=(strlen(lista->str))-x;
if ( ((lung%2) == 0) && ( (strlen(a)) < (strlen(lista->str)) && ( (strlen(a)) < (strlen(b)) ) ) ){
printf("TROVATA\n");
listapuntata *tmp=(listapuntata *)malloc(sizeof(listapuntata));
tmp=lista;
lista=tmp->next;
free(tmp);
}
lista->next=cancellaparticolare(lista->next,x,a,b);
}
return lista;
}
Prova a spostare la struct e compilare. Noterai che quando la struct sta nel .h riesci ad accedere ai campi della struct, mentre se la sposti nel .c devi passare per forza dal puntatore e ai suoi campi non riesci ad accederci, quindi hai separato bene.