Aiuto

di il
1 risposte

Aiuto

Risolto il problema di implementare una lista doppia circolare ordinata e di inserirci in una posizione qualsiasi mantenedo l'ordine un nodo...non riesco a stampare la lista in avanti e indietro qualcuno mi aiuta?

1 Risposte

  • Re: Aiuto

    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);
    }
    }
Devi accedere o registrarti per scrivere nel forum
1 risposte