#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* agli elementi della lista si accede tramite puntatore
e' concatenata doppia con una sentinella, che e' il primo elemento della lista
e che si distingue dagli altri perche' dato==0
poi vedi tu quale valore ti e' + comodo
*/

struct figura
{ int dato;
struct figura *prev;
struct figura *next;
};

typedef struct figura figura;

figura *crealista(void)
{
figura *s = malloc(sizeof(figura)); /*alloco la memoria per il primo puntatore che è la sentinella*/

if(!s) { fprintf(stderr,"Errore di allocazione nella creazione della lista\n");
exit(-1); };

s->next = s->prev = s;
s->dato = 0;
return s;
}

/*stampa la lista dalla testa alla coda*/
void printfor (figura *p)
{ figura *q; /* l'iteratore attraversa la lista partendo dal primo elemento */
for (q=p->next; (q->dato != 0); q=q->next)
printf("%d\t",q->dato); }


/* inserisce in coda alla lista puntata da s il numero n */
figura *insertlista(figura *s, int n)
{
figura *q = malloc(sizeof(figura));

if(!q) { fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
exit(-1); };
q->dato = n;

s->prev->next = q;
q->prev = s->prev;
s->prev = q;
q->next = s;

return s;
}

/* restituisce il puntatore al primo nodo della lista che contiene n
se n e' presente; altrimenti stampa un msg*/
figura* cercalista(figura *p, int n)
{ figura *q;
for (q=p->next; (q->dato != 0); q=q->next)
{ if (q->dato == n)
break; }
return q; }

/* cerca il numero f nella lista puntata da l; se non c'è non viene eseguito nulla */
void cancellalista(figura *l, int f)
{ figura *it = l->next;
figura *canc = cercalista(l,f);
if ( canc != 0 )
{ canc->next->prev = canc->prev;
canc->prev->next = canc->next;
}
}

/* inserisce nella lista puntata da p il numero n
in ordine crescente */
void insertlista_ordine(figura *p, int n)
{
figura *q = malloc(sizeof(figura));
figura *it;

if(!q) { fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
exit(-1); };
q->dato = n;

for ( it = p->next; ((it->dato != 0) && (it->dato < n)); it = it->next)

it->prev->next = q;
q->prev = it->prev;
it->prev = q;
q->next = it;

}




l'ho adattata e compilata con gcc, fammi sapere se cmq da' errori in esecuzione o logici di qualunque genere! bye