Tutto risolto
#include <stdio.h>
#include <stdlib.h>
//dichiarazioni
//#define MYTRACE
struct nodo
{
int elemento; //campo che contiene il valore
struct nodo* next; //campo che contiene il punt al prossimo nodo
struct nodo* prev; //campo che contiene il punt al nodo precedente
struct nodo * head; // puntatore alla testa della lista
};
struct nodo* Insert(struct nodo* lista, int elemento);
struct nodo *cancella( struct nodo *lista, int elemento);
int contaC(struct nodo *lista);
void Print(struct nodo* lista);
int main()
{
struct nodo* lista=NULL;
int totale=0;
lista = Insert(lista,9);
lista = Insert(lista,3);
lista = Insert(lista,4);
lista = Insert(lista, 5);
lista = cancella(lista,3);
lista = cancella(lista,4);
lista = cancella(lista,5);
lista = cancella(lista,9);
totale=contaC(lista);
printf("numero dei nodi della lista = %d \n", totale);
Print(lista);
getchar();
return 0;
}
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
if(lista==NULL ) //lista nulla
{
printf(" Inserisco il primo nodo = %d \n ",nuovo->elemento);
lista = nuovo;
lista->next = 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("inserisco in mezzo\n");
nuovo->next=q;
nuovo->prev=(q->prev);
q->prev->next=nuovo;
q->prev=nuovo;
}else{
printf("inserisco in coda\n");
nuovo->next=lista;
q->next=nuovo;
nuovo->prev=q;
lista->prev=nuovo;
}
}
}
q=lista;
return(lista);
}
//voglio contare quanti elementi ci sono in una lista
int contaC(struct nodo *lista)
{
struct nodo* head = lista;
int totale=0;
if (lista!=NULL){
do {
lista = lista->next;
totale++;
} while( lista!=head);
}
return totale;
}
struct nodo *cancella( struct nodo *lista, int elemento)
{
struct nodo *head =lista;
struct nodo *q = lista;
if (lista!=NULL)
{
head=lista;
do
{
if (q->elemento==elemento)
{
if (q->next==lista && q->prev==lista)
{
printf("lista con un solo elemento che è quello da cancellare \n");
head=NULL;
printf("lista vuota \n");
} else {
(q-> prev)->next=q-> next;
(q-> next)->prev=q-> prev;
if (q ==head)
{
printf("lista con più elementi e devo cancellare la testa \n");
head=q-> next;
}
free(q);
q=NULL;
break;
}
} else {
//avanzo di una posizione
q = q-> next;
}
printf("uscita\n");
} while(lista!=q);
}else{
printf("lista vuota \n");
}
return head;
}
void Print(struct nodo* lista)
{
struct nodo * head = lista;
if (lista!=NULL){
printf("LISTA CIRCOLARE = \n ");
printf("LISTA CIRCOLARE stampata in avanti= \n ");
do {
printf("%d ; \n", lista->elemento);
lista=lista->next;
} while(lista!=head);
printf("LISTA CIRCOLARE stampata all'indietro= \n ");
do {
printf("%d ; \n", lista->elemento);
lista=lista->prev;
} while(lista!=head);
}
}