Trash memory output function inserts in the middle of a list

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% as_% I called:

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");
}

Create Node:

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

You entered correctly in position 2, it turns out that the impression of number 5 was memory garbage. Could someone help me solve this problem to print number 5 properly.

Thank you very much

    
asked by anonymous 25.05.2017 / 21:45

1 answer

1

The function was receiving a new node and creating a new node inside 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 create_no and is passed as parameter and put just an int in place.

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

And no 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;
}
    
26.05.2017 / 09:42