nunolevezinho Posted June 3, 2013 at 06:19 PM Report #510742 Posted June 3, 2013 at 06:19 PM (edited) 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 June 3, 2013 at 06:21 PM by nunolevezinho
HappyHippyHippo Posted June 3, 2013 at 08:09 PM Report #510749 Posted June 3, 2013 at 08:09 PM 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 Portugol Plus
nunolevezinho Posted June 3, 2013 at 09:48 PM Author Report #510780 Posted June 3, 2013 at 09:48 PM (edited) 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 June 3, 2013 at 09:50 PM by nunolevezinho
KTachyon Posted June 3, 2013 at 11:50 PM Report #510802 Posted June 3, 2013 at 11:50 PM 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
nunolevezinho Posted June 4, 2013 at 07:36 PM Author Report #511042 Posted June 4, 2013 at 07:36 PM (edited) 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 June 4, 2013 at 07:47 PM by nunolevezinho
pmg Posted June 4, 2013 at 08:36 PM Report #511050 Posted June 4, 2013 at 08:36 PM (edited) 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 June 4, 2013 at 08:38 PM 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!
KTachyon Posted June 4, 2013 at 08:36 PM Report #511051 Posted June 4, 2013 at 08:36 PM 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
nunolevezinho Posted June 4, 2013 at 09:08 PM Author Report #511054 Posted June 4, 2013 at 09:08 PM 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! 👍
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now