Lista Ligada Linear - Retirar elemento Pretende-se retirar o elemento com valor h da lista: Para isso é necessário modificar o valor do ponteiro para a caixa anterior à do elemento a ser retirado da lista: antpˆ.prox := pˆ.prox; Nem é necessário ter um apontador auxiliar para o elemento a retirar pois basta usar o apontador antp: MP II, 2006/2007 p.20/32
Lista Ligada Linear - Retirar elemento Pretende-se retirar o elemento com valor h da lista: Para isso é necessário modificar o valor do ponteiro para a caixa anterior à do elemento a ser retirado da lista: Nem é necessário ter um apontador auxiliar para o elemento a retirar pois basta usar o apontador antp: antpˆ.prox := antˆ.proxˆ.prox; No entanto, sem auxiliar, perde-se a caixa retirada, logo, dever-se-ia fazer: p := antˆ.prox; antpˆ.prox := antˆ.proxˆ.prox; ficando a caixa com o elemento retirado pendurada em p MP II, 2006/2007 p.20/32
Remover elementos numa lista ligada simples Retirar elemento à cabeça Pretende-se remover e libertar a cabeça da lista, devolvendo a cauda como nova lista procedure removec(var ponta : Seta); {* remove a cabeca da lista pendurada em ponta *} var aux : Seta; if ponta <> nil { se a lista tem elementos } then aux := ponta; ponta := pontaˆ.prox; dispose(aux); MP II, 2006/2007 p.21/32
Remover elementos numa lista ligada simples Retirar da cauda - Versão 2: Usar um só ponteiro auxiliar para percorrer a lista procedure removefim2(var ponta : Seta); {* remove o ultimo elemento da lista *}/ var antp: Seta; if ponta <> nil then if pontaˆ.prox = nil then { lista com 1 elemento } p := ponta; ponta := nil; else { lista com varios elementos } antp := ponta; while antpˆ.proxˆ.prox <> nil do antp := antpˆ.prox; p := antpˆ.prox; { elemento a remover } antpˆ.prox := nil; dispose(p); { fim removefim2 } MP II, 2006/2007 p.24/32
Remoção no fim com ponteiro auxiliar Remove o ultimo elemento da lista, apontado por ult procedure removet(var ponta, ult : Seta); var antult : Seta; if ponta <> nil then antult := devolveant(ponta, ultˆ.valor); if antult <> nil { se ultimo <> primeiro } then antult->prox := nil; dispose(ult); ult := antult; end else { ultimo = primeiro } dispose(ponta); ponta := nil; ult := nil; {if ponta} { fim removet } MP II, 2006/2007 p.25/32
Inserção de novo elemento à cabeça 1 Função para criar novo elemento e devolver um seu apontador: function novo elem( info : TipoValor): Seta; var pt : Seta; new(pt); ptˆ.valor := info; ptˆ.prox := nil; novo elem := pt; { fim novo elem } 2 Procedimento para inserir, à cabeça, novo elemento com a informação dada na lista dada: procedure inserec(var ponta : Seta; info : TipoValor); var novo : Seta; novo := novo elem(info); novoˆ.prox := ponta; ponta := novo; { fim inserec } MP II, 2006/2007 p.26/32
Inserção de novo elemento no fim da lista 1. Atravessar a lista até parar no último elemento 2. Inserir novo elemento procedure inserefim(var ponta : Seta; info : TipoValor); var novo, aux : Seta; novo := novo elem(info); if ponta = nil then ponta := novo { lista vazia } else { lista com 1 ou + elementos } aux := ponta; while auxˆ.prox <> nil do aux := auxˆ.prox; auxˆ.prox := novo; { fim inserec } MP II, 2006/2007 p.27/32
Inserção no fim com ponteiro auxiliar Insere após o ultimo elemento da lista, apontado por ult procedure inseret(valor : TipoValor; var ponta, ult : Seta); var novo : Seta; novo = novo_elem(valor); if ponta = nil { lista vazia } then ponta := novo; else ultˆ.prox = novo; { lista com 1 ou + elementos } ult = novo; { fim inseret } MP II, 2006/2007 p.28/32
Pesquisas gerais em Listas Ligadas Simples Uma pesquisa é uma travessia da lista, até à identificação de um certo elemento ou até esgotar a lista. Este caso é facilmente corrigido usando, para cabeça do ciclo de pesquisa, a instrução: antp := nil; p := ponta; while p <> nil do if pˆ.valor <> estainfo then antp := p; p := pˆ.prox; end MP II, 2006/2007 p.31/32
Função de pesquisa Procura o elemento da lista que contém estevalor e devolve um apontador para o elemento anterior function procura(estevalor : TipoValor; ponta: Seta): Seta; var ant : Seta; ant = nil; while ponta <> nil do if pontaˆ.valor <> estevalor then ant := ponta; ponta := pontaˆ.prox; {while} if ponta = nil then ant := nil; procura = ant; { fim procura } MP II, 2006/2007 p.32/32