À pessoa que estava com dúvida em lista encadeada [RESOLVIDO]

1. À pessoa que estava com dúvida em lista encadeada [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/05/2015 - 16:18h

[Você, que não sei quem é, apagou o tópico original, mas eu já tinha escrito uma resposta para você. Ei-la. Espero que faça bom proveito.]


Achei particularmente curioso o seguinte comando:

		lst -> proxima = lst -> proxima; 


Fazer x=x, você deve concordar, não é muito útil. Você quis dizer lst=lst->proxima?

Além desse erro óbvio, a função tem um nome que sugere apagamento do nó. Só que eu não vi nenhuma chamada a free() (ou delete, se for C++). Sem ela, você vai provocar uma desperdício de memória (memory leak).

Não sei exatamente como é o seu tipo de dados, mas me parece que você deveria fazer algo mais parecido com o seguinte.

tlista *apagarinicio(tlista *inicio){
tlista *p=inicio;
if(inicio){
inicio=inicio->proxima;
free(p);
}
return inicio;
}


Como o ponteiro passado como argumento para a função é apenas uma cópia do valor do ponteiro original, atribuir externamente o valor de retorno da função ao ponteiro seria obrigatório. Ou seja: você teria que chamar a função exatamente como mostrado abaixo.

/* Mesmo ponteiro como argumento e como destino do valor retornado. */
inicio=apagarinicio(inicio);


Como isso é propenso a erro, seria melhor modificar a função para uma referência para o ponteiro a ser alterado.

void apagarinicio(tlista **p_inicio){
if(p_inicio && *p_inicio){
tlista *p=*p_inicio;
*p_inicio=p->proxima;
free(p);
}
}


A forma de chamar essa nova versão só faria menção ao ponteiro que aponta para o início da lista uma vez, só que ele teria de ser explicitamente passado por referência.

apagarinicio(&inicio);  /* Note o ‘&’. */ 



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts