/***********    HEADER DE LA LLISTA GENERICA KKEP   *****************/
/********************************************************************\
*       Aqui teniu el header de la llista generica total!!!          *
*                                                                    *
* NOTA: En contra del que sovint he insinuat que faria, no l'he      *
* copiada de cap vostra. Es bastant diferent, crec. Conte totes      *
* les barbaritats que us demanavem i algunes floritures mes. A       *
* mes a mes, he afegit d'ultima hora algunes cosetes boniques        *
* que he vist en les vostres practiques. Com totes les llibreries    *
* del Share, aquesta tambe es de domini public pero aneu amb cura    *
* si les feu servir per practiques.                                  *
*                                                                    *
* Millores implementades:                                            *
*  - Totes les funcions del node llista es fan servir com si         *
*       fossin les funcions de la llibreria standard, stdlib:        *
*       * strcmp, strcpy, malloc, free i strcat.                     *
*  - Permet diversos tipus d'insercions, segons el que passa         *
*       quan colisionin dos claus iguals:                            *
*       * La nova es postposa a la vella                             *
*       * La nova s'anteposa a la vella                              *
*       * La nova no s'insereixi                                     *
*       * La nova sustituexi la vella                                *
*       * La nova modifiqui la vella                                 *
*  - Permet operacio simultanea amb finestra i per valor a           *
*       la mateixa llista sense que un destorbi a l'altre.           *
*  - Permet dos tipus de consultes, segons es retorni                *
*       * Una copia de l'element a una altre zona de memoria         *
*       * Un punter al mateix element de la llista                   *
*  - Permet definir a la vegada:                                     *
*       * Mes d'una llista                                           *
*       * de les diferents classes a dalt mencionades                *
*       * i contenint diferents tipus d'elements                     *
*  - Funcio aplica: Resol la majoria de les vostres floritures.      *
*  - Funcio acomula: Permet obtindre un resultat de tipus            *
*       generic calculat a partir de tots els elements de la         *
*       llista.                                                      *
*                                                                    *
* Limitacions:                                                       *
*  - Per mantenir la consistencia de l'ordenacio, no es aconse.      *
*       llable inserir per finestra indiscriminadament si fem        *
*       quelcom per valor o un llista_posiciona_finestra.            *
*  - Per evitar core dumped's, s'aconsella initcialitzar la          *
*       finestra sempre que s'esborri per valor.                     *
*                                                                    *
* Be, i ara... qui s'atreveix a:                                     *
*  - Fer-la doblement encadenada.                                    *
*  - Fer-la circular.                                                *
*  - Fer-la multi-finestra.                                          *
*                                                                    *
\********************************************************************/

/********************************************************************\
*   TAD Llista generica                                              *
\********************************************************************/

typedef struct NODE_LLISTA {
  void *v;
  struct NODE_LLISTA *s;
  } node_llista;

typedef struct LLISTA {
  int quants;
  node_llista *cap,*act;
  int (*gencmp) (void*,const void*);
  void* (*genalloc) (void);
  void (*gencpy) (void*,void*);
  void (*genfree) (void*);
  void (*gencat) (void*,const void*);
  } llista;

/********************************************  CREACIO I DESTRUCCIO */
llista *llista_crea( int (*fcmp) (void*,const void*),
                     void* (*falloc) (void),
                     void (*fcpy) (void*,void*),
                     void (*ffree) (void*),
                     void (*fcat) (void*,const void*));
void llista_destroy (llista *l);

/*********************  IMPLEMENTACIO AMB PUNT D'INTERES (FINESTRA) */
void llista_primer (llista *l);
void llista_seguent (llista *l);
int llista_fi (llista *l);
void llista_posiciona (llista *l,void *v);
void llista_fes_copia_finestra(llista *l, void *v);
void* llista_consulta_finestra(llista *l);
void llista_esborra_finestra(llista *l);
int llista_afegeix_finestra (llista *l, void*v);

/****************************************** IMPLEMENTACIO PER VALOR */
int llista_fes_copia(llista *l, void *v1, const void *v2);
void* llista_consulta(llista *l, const void *v);
int llista_esborra(llista *l, const void *v);
int llista_afegeix (llista *l, void *v);

/************  LA FAMOSA FUNCIO APLICA I ALTRA FUNCIO IGUAL DE UTIL */

void llista_aplica (llista *l, void*(*modifica)(void*));
void llista_acomula (llista *l, void (*acomula)(void*en,void*esto),
                      void *valor_acomulat) {
