Ragazzi, allora, mi trovo di fronte ad un problema che proprio non riescono a risolvere, e non me lo spiego nemmeno.

Allora, ho queste due funzioni:
codice:
int cerca_occorrenza(Lista L, int occ, item_type_lista *el, int (*compare)(item_type_lista *, item_type_lista *))
{
  if (!lista_vuota(L))
  {
    Lista_ls l = (Lista_ls) L;
    struct campo_lista *temp = l->Head;
    int pos = 1;
    int occorrenza = 0;
    while (temp)
    {
      if ((*compare)(&temp->info, el) == 0)
	if (++occorrenza == occ)
	  return pos;
      pos++;
      temp = temp->next;
    }
  }
  return 0;
}

int modifica_occorrenza(Lista L, int occ, item_type_lista *vecchio, item_type_lista *nuovo, int (*compare)(item_type_lista *, item_type_lista *))
{
  if (!lista_vuota(L))
  {
    int pos = cerca_occorrenza(L, occ, vecchio, compare);
    printf("pos:\t%d\n", pos);
    if (pos)
      return assegna(L, pos, nuovo);
  }
  return 0;
}
allora, come potete vedere modifica_occorrenza richiama la funzione cerca_occorrenza. La funzione compare serve a fare il confronto tra due elementi della lista.
Se richiamo la funzione trova_occorrenza dal main funziona perfettamente, ma sulla stessa lista richiamo modifica_occorrenza e trova_occorrenza restituisce 0, come se non trovasse l'occorrenza.

La funzione modifica_occorrenza la richiamo così:
codice:
eliminato = elimina_occorrenza(L, inserito, &elemento_vecchio, &elemento, compara);
e compara è dichiarata:
codice:
int compara(item_type_lista *, item_type_lista *);
scusate... avevo dimenticato il linguaggio