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
begin
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
Download

Slides