LISTE DOPPIE CIRCOALRI

di il
1 risposte

LISTE DOPPIE CIRCOALRI

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

  • Re: LISTE DOPPIE CIRCOALRI

    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