RISOLTO
ECCOLO
struct nodo* Insert(struct nodo* lista, int elemento)
{
struct nodo* q;
struct nodo* head;
int appoggio;
struct nodo * nuovo= malloc(sizeof(struct nodo)); //alloco nuovo nodo
nuovo->elemento = elemento; //gli assegno un determinato valore
printf("nuovo nodo= %d\n",nuovo->elemento);
if(lista==NULL ) //lista nulla
{
printf(" Inserisco il primo nodo = %d \n ",nuovo->elemento);
lista = nuovo;
lista->next = lista;
//lista->head = lista;
nuovo->prev=nuovo;
#ifdef MYTRACE
printf("controllo indirizzi1 \n");
printf("lista prima %d \n", &(lista->prev)->elemento);
printf("lista dopo %d \n", &(lista->next)->elemento);
printf("nuovo prima %d \n", &(nuovo->prev)->elemento);
printf("nuovo dopo %d \n", &(nuovo->next)->elemento);
printf("controllo valori1 \n");
printf("lista prima %d \n", (lista->prev)->elemento);
printf("lista dopo %d \n", (lista->next)->elemento);
printf("nuovo prima %d \n", (nuovo->prev)->elemento);
printf("nuovo dopo %d \n", (nuovo->next)->elemento);
#endif
}else {
head=lista;
q=lista;
printf("LISTA CON ALMENO 1 ELEMENTO \n ");
if(lista->next == lista) //lista con un solo elemento
{
printf(" elemento da inserire più GRANDE dell'elemento della lista \n ");
if(q->elemento > nuovo->elemento)
{
printf(" elemento da inserire più PICCOLO dell'elemento della lista \n ");
printf(" scambio i valori \n ");
appoggio=nuovo->elemento;
nuovo->elemento=q->elemento;
q->elemento=appoggio;
}
nuovo->next=lista;
q->next=nuovo;
nuovo->prev=lista;
nuovo->prev->prev=nuovo;
# ifdef MYTRACE
printf("controllo indirizzi2 \n");
printf("lista %d \n", &lista->elemento);
printf("lista prima %d \n", &(lista->prev)->elemento);
printf("lista dopo %d \n", &(lista->next)->elemento);
printf("nuovo %d \n", &(nuovo->elemento));
printf("nuovo prima %d \n", &(nuovo->prev)->elemento);
printf("nuovo dopo %d \n", &(nuovo->next)->elemento);
printf("controllo valori \n");
printf("lista prima 2%d \n", (lista->prev)->elemento);
printf("lista dopo %d \n", (lista->next)->elemento);
printf("nuovo prima %d \n", (nuovo->prev)->elemento);
printf("nuovo dopo %d \n", (nuovo->next)->elemento);
#endif
} else {
printf("lista con più elementi\n");
if(head->elemento > nuovo->elemento)
{
printf("lista con più elementi inserimento prima di tutti\n");
appoggio=nuovo->elemento;
nuovo->elemento=q->elemento;
q->elemento=appoggio;
}
//lista con un più elementi e non devo inserire prima di tutti
while(q->next != lista && nuovo->elemento > q->elemento)
{
q=q->next;
}
if( q->elemento > nuovo->elemento )
{
//inserisco in mezzo
printf(" elemento da inserire in mezzo \n ");
printf("q elemento %d \n", q->elemento);
printf("nuovo elemento %d \n", nuovo->elemento);
nuovo->next=q;
printf("q elemento %d\n", q->elemento);
printf("nuovo dopo elemento %d \n", nuovo->next->elemento);
nuovo->prev=(q->prev);
printf("q prima elemento %d\n", q->prev->elemento);
printf("nuovo prima elemento %d \n", nuovo->prev->elemento);
q->prev->next=nuovo;
printf(".... %d \n", q->prev->next->elemento);
q->prev=nuovo;
printf(".... %d \n", q->prev->elemento);
}else{
printf("inserisco in coda\n");
nuovo->next=lista;
q->next=nuovo;
nuovo->prev=q;
lista->prev=nuovo;
}
}
}
q=lista;
return(lista);
}