LISTE DOPPIE CIRCOALRI

di Anonimizzato5791 il
1 risposte
HO CREATO LA SEGUENTE FUNZIONEPER L'INSERIMENTO DI UN NODO IN UNA POSIZIONE ARBITRARIA IN UNA LISTA ORDINATA ORA VORREI TRASFORMARLA IN UNA LISTA CIRCOLARE MA NON MI TROVO CON I LINK!!!HO PROVATO A FARMI STAMPARE LA LISTA DALL'INIZIO ALLA FINE E VICEVERSA SUCCEDE UN DISASTRO CHI MI AIUTA???




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

head=lista; //testa della lista
q=lista;


if(lista==NULL ) //lista nulla
{
printf(" Inserisco il primo nodo = %d \n ",nuovo->elemento);
q=nuovo;
nuovo->next=NULL;
head=q;
lista=head;


} else {

printf("LISTA CON ALMENO 1 ELEMENTO \n ");
head=lista;
head=q;
if(q->next == NULL) //lista con un solo elemento
{
printf(" elemento da inserire pil piccolo dell'elemento della lista \n ");
if(q->elemento > nuovo->elemento)
{

printf(" scambio i valori \n ");
appoggio=nuovo->elemento;
nuovo->elemento=q->elemento;
q->elemento=appoggio;
}


nuovo->next=NULL; // elemento da inserire maggiore dell'unico elemento della lista

nuovo->prev=lista->next;




q->next=nuovo;
nuovo->prev=lista;




}/* else {

// lista con pil elementi inserimento prima di tutti
if(head->elemento > nuovo->elemento)
{
appoggio=nuovo->elemento;
nuovo->elemento=q->elemento;
q->elemento=appoggio;
}

//lista con un pil elementi e non devo inserire prima di tutti

while(q->next != NULL && q->elemento < nuovo->elemento)
{
q=q->next;
}

printf(" nodo q dopo =%d \n ",(q->next)->elemento);
printf(" nodo q prima =%d \n ",(q->prev)->elemento);

if( q->elemento > nuovo->elemento)
{
//inserisco in mezzo

printf(" elemento da inserire in mezzo \n ");
nuovo->next=q;
nuovo->prev=q->prev;


printf(" controllo nuovo prev =%d \n ",(nuovo->prev)->elemento);
printf(" controllo nuovo next =%d \n ",(nuovo->next)->elemento);

if(q!=NULL)
{
(q->prev)->next=nuovo;
q->prev=nuovo;
}
}else{



return(q);


} */
}








return(head);

}

1 Risposte

  • 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);

    }
Devi accedere o registrarti per scrivere nel forum
1 risposte