Trash memory output function inserts in the middle of a list

Asked

Viewed 59 times

1

Staff developed this function:

tipo_lista * insere_meio(tipo_lista *aux, tipo_lista * valor, int pos){
 int cont=1; //é a posição do primeiro elemento da lista encadeada
 tipo_lista * p = aux;
 tipo_lista * novo = (tipo_lista*)malloc(sizeof(tipo_lista));
 while (cont != pos){ //testa se é igual a posição que ele quer inserir
     p = p -> prox;
     cont++;
 }
 novo -> info = valor;
 novo -> prox = p -> prox;
 p -> prox = novo;
 return aux;
}

In the main calling in:

p = insere_meio(p, cria_no(5), (2));

Prints:

void imprime_lista(tipo_lista* p)
{
 while (p != NULL)
 {
     printf("%d ", p->info);
     p = p -> prox;
 }
 printf("\n");
}

Cria Nó:

tipo_lista * cria_no (int valor)
{
 tipo_lista * novo;
 novo = (tipo_lista *)malloc(sizeof(tipo_lista));
 novo -> info = valor;
 novo -> prox = NULL;
 return novo;
}

It entered correctly at position 2, it turns out that the number 5 printing was from memory junk. Could someone help me solve this problem to print the number 5 properly.

Thank you very much

  • 1

    You could show us the function that runs through the printing nodes and creates the nodes?

  • 1

    @Jeffersonquesado already added the functions you need.

  • 1

    Okay, I detected two problems : a) you should not create a new list_type object if you are already passing this value ; b) novo->info = valor is entering in the information the memory address of the pointer valor

  • I will elaborate better on a response that I commented on ; only I may take a while

1 answer

1


The function was getting a new node and creating a new node within it, that is, it was doing the process twice. In the case of my answer I removed the node that is created by the function cria_no and is passed as parameter and just put an int in place.

tipo_lista * insere_meio(tipo_lista *aux, int valor, int pos){
...
...
}

And in main:

p = insere_meio(p, 5, (2));

Another possible answer is using the new node that is passed to the function and failing to create the novo within it.

//valor foi mudado para novo, porque neste caso um novo nó é passado e não um valor
tipo_lista * insere_meio(tipo_lista *aux, tipo_lista * novo, int pos){
    int cont=1; //é a posição do primeiro elemento da lista encadeada
    tipo_lista * p = aux;
    //Não é mais necessário criar o novo na próxima linha
    //tipo_lista * novo = (tipo_lista*)malloc(sizeof(tipo_lista));
    while (cont != pos){ //testa se é igual a posição que ele quer inserir
        p = p -> prox;
        cont++;
    }
    //O novo nó já possui o seu valor atribuído
    //novo -> info = valor;
    novo -> prox = p -> prox;
    p -> prox = novo;
    return aux;
}
  • 1

    Do you have any reason for this change? Your answer is incomplete

  • Placed tipo_lista * valor instead of ìnt valor.

  • 1

    Jefferson, I edited the answer explaining better what was done.

  • 1

    André, an observation, if you try to enter in the first position the function will not work, because in this case you would have to return the new.

  • The last one didn’t work out. For everything here.

  • 1

    The main one is: p = middle inserts(p, cria_no(5), (2));

Show 1 more comment

Browser other questions tagged

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