Jump to content
nunolevezinho

[Resolvido] Editar nó de uma lista ligada

Recommended Posts

nunolevezinho

Boas, como o título diz, estou a tentar editar um nó de uma lista ligada.

Tenho vários problemas, um deles é o facto de eu conseguir editar o nó, mas todos os nós anteriores são eliminados.

Ex:

estudante1 20 -> estudante2 85 -> estudande3 40 -> NULL

Edito o valor do estudante2 para 100 e depois a minha lista fica:

estudante2 100 -> estudande3 40 -> NULL

O outro problema é que este "editar" só ocorre depois de uma dada condição passar.

E este "editar" está dentro de um cliclo while, e a lista chega ao fim antes de poder editar todos os estudantes que quero.

Edited by nunolevezinho

Share this post


Link to post
Share on other sites
HappyHippyHippo

sem código é como atirar-me contra uma parede : arrisco-me a aleijar ...

mas vamos lá ver porque razão tal aconteceria :

- estás a retornar na função de alteração o ponteiro para o elemento alterado e a guardar-lo no ponteiro que guarda a "lista"


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
nunolevezinho

Pois acho que é isso mesmo <.<

pno ReporStocks(pno prod)
{

/* palha */

 while (prod != NULL && prod->IDProduto != id)
  prod = prod -> proximo;

 if(prod != NULL)
 {
  prod->quantidade = prod->quantidade + quantidade; //produto existe, adiciona nova quantidade

 } else {

 prod = AdicionaProduto(prod, id, quantidade, corredor, armario);
 }
}

 /* palha */

fclose(file);
return prod;
}

Edited by nunolevezinho

Share this post


Link to post
Share on other sites
KTachyon

Deves estar a fazer isto:

lista = ReporStocks(lista);

Quando devias não retornar nada da função, ou fazer qualquer coisa do género:

pno no_alterado = ReporStocks(lista);

E está ali um fclose() perdido no meio do código por alguma razão específica, ou está relacionado com alguma coisa que está no meio da /* palha */?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
nunolevezinho

Respondendo a tua ultima observação, aquele fclose nao era para ter aparecido ali, pertence à /* palha */.

Eu ja consigo actualizar os quantidades sem perder os outros nós. Mas quando não encontro um produto, ele adiciona o produto em falta cerca de 50 vezes cada 1.

Tenho algo no ciclo while que está mal.

Parece-me que estou a ler a lista toda e se não encontrar o dito id, adiciona sempre o produto.

Isto gera um problema porque adiciona o mesmo produto varias vezes até a lista chegar ao fim :/

passo o id por argumento;
enquanto a lista tiver elementos
{
se lista->id for igual ao id de argumento
{
actualiza produto da lista com nova quantidade():
}
senao
{
adiciona novo produto a lista();
}
lista = lista->proximo;
}

void UpdateStock(pno prod, int id, int quantidade)
{
int valor, corredor, armario;
while (prod != NULL)
{
if(prod->IDProduto == id)
{
printf("Existe! Adiciona Quantidade\n\n");
prod->quantidade = prod->quantidade + quantidade; //produto existe, adiciona nova quantidade
}
else
{
printf("Nao Existe! Adiciona Produto\n\n");
valor = ObtemCoordsLivres();
corredor = valor/10;
armario = valor%10;
prod = AdicionaProduto(prod, id, quantidade, corredor, armario);
}
prod = prod -> proximo;
}
}

Como posso contornar esta situação ?

PS: Alguém sabe porque é que quando eu coloco aqui o código, ele perde a indentação ?

Edited by nunolevezinho

Share this post


Link to post
Share on other sites
pmg

Independentemente do resultado do if, a instrucao seguinte vai ser sempre executada!

prod = prod->proximo;

Sugestao: faz return; na parte verdadeira do if.

passo o id por argumento;
enquanto a lista tiver elementos
{
   se lista->id for igual ao id de argumento
   {
       actualiza produto da lista com nova quantidade():
       /* SAI DO PROCEDIMENTO */
   }
   lista = lista->proximo;
}
adiciona novo produto a lista();

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
KTachyon

Podes contornar se fizeres da forma como apresentaste anteriormente, mas mantiveres a sempre a referência para o produto anterior.

Se não utilizares as opções de formatação, o código aparece indentado.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
nunolevezinho

void UpdateStock(pno prod, int id, int quantidade)
{
       int valor, corredor, armario;
       pno lista_inicio = prod;

       while (prod != NULL)
       {
               if(prod->IDProduto == id)
               {
                       prod->quantidade = prod->quantidade + quantidade; //produto existe, adiciona nova quantidade
                       return;
               }
               prod = prod -> proximo;
       }

       prod = lista_inicio->proximo;
       valor = ObtemCoordsLivres();
       corredor = valor/10;
       armario = valor%10;
       prod = AdicionaProduto(prod, id, quantidade, corredor, armario);
}

Obrigado! :thumbsup:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.