How to store a chained list

Asked

Viewed 127 times

1

Hello, I have some questions that I will illustrate below: Having two double chained lists A and B with the structure

struct lista
    {
        Ponto* dado;        /* dado = número */
        struct lista *prox; /* ponteiro para o proximo elemento */
        struct lista *ant;  /* ponteiro para o elemento anterior */
    };

how different between 1:

a->ant = b->ant;
a->prox = b->prox;
a->dado = b->dado;

and 2:

a = b;

Edit 1: Why of my doubt: I am making a code with insertionsort with chained lists. Where my error is from the line where I commented

/* preparing for the next looping */

My goal from this line is: List primeiro_definitive must store the value of Shortlist when it is in the first looping, but in the second looping Shortlist is changed and I do not want the first definitive list to be changed together, I want him to keep keeping the value he got when he went into the if by the end of the code, and I’m not being able to do that. The way it is, when the smaller list changes later, Primeiro_definitive ends up changing too.

Lista* lista_insertionsort(Lista* l)
{

    Lista* primeiro = (Lista*)malloc(sizeof(Lista));
    Lista* menor = (Lista*)malloc(sizeof(Lista));
    Lista* p = (Lista*)malloc(sizeof(Lista));
    Lista* primeiro_definitivo = (Lista*)malloc(sizeof(Lista));
    primeiro_definitivo = l;
    primeiro = l;
    menor = l;
    p = l;
    int alterado = 0;



    while(menor->prox != NULL)
    {
        printf("oi2\n");
        //Encontra o menor
        while(p != NULL)
        {
            if(menor->dado->x > p->dado->x)
                menor = p;
            p=p->prox;
        }
        printf("menor dado: %d", menor->dado->x);
        /*
        Nesta parte do código: menor aponta para o menor valor
        p aponta para o ultimo elemento da lista
        primeiro aponta para o primeiro que não foi alterado
        */
        //troca de posição primeiro com menor
        if(primeiro->dado->x != menor->dado->x)
        {

            if(primeiro->prox->dado->x == menor->dado->x)
                troca_adjacentes(primeiro, menor);

            else
                troca_nao_adjacentes(primeiro, menor);

            alterado = 1;
        }

        /* preparando para o proximo looping */
        if(alterado == 1){
            p = menor;
            p->ant = menor->ant;
            p->prox = menor->prox;
            p->dado = menor->dado;
            primeiro = menor->prox;
            if(menor->ant == NULL){//caso seja o menor da lista inteira, ele será o retorno

                primeiro_definitivo = menor;
                }
        }
        else{
        p = menor;
        primeiro = primeiro->prox;
        p->ant = primeiro->ant;
        p->prox = primeiro->prox;
        p->dado = primeiro->dado;
        }
        alterado = 0;
    }
    return primeiro_definitivo;

}
  • Your question is very confused. I couldn’t figure out what your question/doubt is. Try to explain in words, and in great detail what you are trying to do and what your doubts are

  • Thank you, I added more information

1 answer

0

The difference is that a and b are pointers. When Voce does:

a->ant = b->ant;
a->prox = b->prox;
a->dado = b->dado;

a and b has the same values. But when you do:

a = b

a and b are the same thing (point to the same region of memory), that is, everything that changes in a will change in b and vice versa.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.