Aula 04 – 22/03 Listas Duplamente Encadeada – Listas Encadeada Circular – Lista Duplamente Encadeada Circular
Continuação exercício aula 15/03
Lista duplamente encadeadas Lista encadeadas simples são unidirecionais, ou seja, a navegação na lista começa de um ponto, o inicio e vai até o final. Lista duplamente escadeadas são bidirecionais, ou seja, a navegação na lista pode ser feito do início até o fina ou do final até o início. Estrutura muito semelhante a lista encadeada simples porem temos um novo ponteiro no nó que faz referencia ao nó anterior. A estratégia para manipular esse tipo de lista é ter um nó cabeça, primeiro item da lista, e um nó cauda, último item da lista.
O nó em uma lista duplamente encadeada possui dois ponteiros um apontando para o primeiro nó anterior e outro apontando par ó próximo nó, além do campo Dado.
Representação gráfica de uma lista com nós
Representação gráfica de inserção na lista
Representação gráfica de exclusão na lista
Operações em listas duplamente encadeadas Incluir, remover os nós em listas duplamente encadeadas requer mais trabalho pois temos o nó cabeça e o nó cauda para serem atualizados. Percorres a lista, liberar os nós alocados são operações semelhantes as listas simplesmente encadeadas.
Estrutura básica de um nó PApontador = ^TItem; TItem = record Anterior: PApontador; Valor: string; Proximo: PApontador; end;
Incluindo um novo nó New( NoAuxiliar ); NoAuxiliar.Proximo:= LDEPrimeiroNo; NoAuxiliar.Anterior:= nil; NoAuxiliar.Valor:= InputBox( '', 'Digite o nome', '' ); if ( LDEPrimeiroNo <> nil ) and ( LDEPrimeiroNo.Anterior = nil ) then LDEPrimeiroNo.Anterior:= NoAuxiliar; LDEPrimeiroNo:= NoAuxiliar; if ( LDEPrimeiroNo.Proximo = nil ) then LDEUltimoNo:= NoAuxiliar;
Excluindo um nó if ( LDEPrimeiroNo.Valor = ValorASerExcluido ) then begin NoAuxiliar:= LDEPrimeiroNo; LDEPrimeiroNo:= LDEPrimeiroNo.Proximo; if ( LDEPrimeiroNo <> nil ) then LDEPrimeiroNo.Anterior:= nil; if ( NoAuxiliar = LDEUltimoNo ) then LDEUltimoNo:= nil; Dispose( NoAuxiliar ); end else
Excluindo um nó – continuação NoAuxiliar:= LDEPrimeiroNo; while ( NoAuxiliar.Proximo <> nil ) do begin if ( NoAuxiliar.Proximo.Valor = ValorASerExcluido ) then NoAnterior:= NoAuxiliar; NoAserExcluido:= NoAuxiliar.Proximo; NoAnterior.Proximo:= NoAserExcluido.Proximo; if ( NoAserExcluido = LDEUltimoNo ) then LDEUltimoNo:= NoAserExcluido.Anterior else NoAnterior.Proximo.Anterior:= NoAnterior; Dispose( NoAserExcluido ); Exit(); end; NoAuxiliar:= NoAuxiliar.Proximo;
Percorrendo a lista – pelo último elemento NoAuxiliar:= LDEUltimoNo; while ( NoAuxiliar <> nil ) do begin ShowMessage(NoAuxiliar.Valor) ; NoAuxiliar:= NoAuxiliar.Anterior; end;
Observações Para identificar o final de uma lista duplamente encadeada utilizamos o nó cauda que é uma variável especial. E continuamos a utilizar uma variável especial para identificar o primeiro nó. Sempre que efetuarmos operações de inclusão ou exclusão de itens da lista devemos nós certificar que estamos atualizando corretamente o nó anterior e o nó atual do item.
Lista Encadeada Circular Possui a mesma estrutura de uma lista simplesmente encadeada Porem o último item da lista aponta para o primeiro item da lista Passamos a ter o nó atual ao invés do nó cabeça
Listas Duplamente Encadeada Circular Possui a mesma estrutura de uma lista duplamente encadeada. O nó anterior do primeiro elemento aponta para o último O próximo no do último elemento apontar para o primeiro elemento da lista.
Exercícios Download : aula04 – exercícios