Como o nome sugere, são compostas
de nós ligados por dois ponteiros. Cada nó de uma lista duplamente encadeada
consiste de três partes: alem dos dados e do ponteiro próximo (next), o nó
passa a incorporar um ponteiro para o elemento anterior (prior).
Ao avaliar o exemplo de lista ligada, pode-se perceber a dependência do mecanismo de inserir e excluir de uma
busca que irá percorrer a toda a lista e a necessidade de durante toda a
procura manter a informação do elemento anterior.
A melhoria para este tipo de
situação se faz com o nó apontando também para o membro anterior da lista,
apesar do aumento do tamanho do nó de informação, a vantagem aparece em termos
de flexibilidade ao poder percorrer a lista em ambas as direções, ao somar a
capacidade de percorrer a lista a partir de seus extremos, passa a incluir mais
um apontador para o fim (end) da lista, junto do inicio (start).
Null
|
<
|
Prior
|
<
|
Prior
|
<
|
End
|
|||||||
Info
|
Info
|
Info
|
|||||||||||
Start
|
>
|
Next
|
>
|
Next
|
>
|
Null
|
O resultado das operações para
este tipo de lista se torna mais intuitivo no momento de passar o conceito para
o código do programa, tanto para inserir, como para remover, analisando uma
inserção entre dois elementos:
a)
Encontrar a posição da lista para incluir o novo
nó.
b)
Novo nó atualiza os endereços de seus
apontadores, usando os dados do nó que utiliza a posição a ser ocupada na
lista.
c)
Inclui o novo nó ao mudar o apontamento de
próximo do nó anterior e o apontamento de anterior do próximo nó.
Mesma
situação se repete para excluir, ao inverter a sequencia de operação.
Abaixo
segue os Detalhes para as três situações que podem ocorrer quando se insere um
item na lista duplamente encadeada:
1.
Item pode
se tornar o primeiro da lista;
Info
|
|||||||||
Info
|
Info
|
||||||||
Start
| > |
Next
| > |
Nulo
|
|||||
Nulo
| < |
Prior
|
< |
End
|
·
Ponteiro anterior do primeiro da lista indica o
novo item.
·
Novo item copia o endereço de próximo que está
em Start.
·
Novo item coloca nulo para anterior.
·
Start aponta para o novo item.
Info
|
|||||||||||||
Start
|
next
|
||||||||||||
Nulo
|
|||||||||||||
Info
|
Info
|
||||||||||||
Next
|
Nulo
|
||||||||||||
Prior
|
Prior
|
End
|
2.
Inserir entre dois outros itens;
Info
|
|||||||||||||||
Info
|
Info
|
||||||||||||||
Start
|
Next
|
Nulo
|
|||||||||||||
Nulo
|
Prior
|
End
|
·
Novo item copia o endereço de próximo que está no
item anterior.
·
Novo item copia o endereço de anterior que está no
item próximo.
·
Item próximo atualiza o endereço anterior para o
novo item.
·
Item anterior atualiza o endereço próximo para o
novo item.
Info
|
|||||||||||||||
Next
|
|||||||||||||||
Prior
|
|||||||||||||||
Info
|
Info
|
||||||||||||||
Start
|
Next
|
Nulo
|
|||||||||||||
Nulo
|
Prior
|
End
|
3.
Ser o ultimo item da lista;
Info
|
Info
|
Info
|
||||||||
Start
|
Next
|
Nulo
|
||||||||
Nulo
|
Prior
|
End
|
·
Troca o Nulo pelo endereço do novo item no
ultimo item da lista.
·
Novo item atualiza endereço de anterior para o
ultimo da lista.
·
Novo item
atualiza endereço de próximo para Nulo.
·
End aponta para o novo item.
Info
|
Info
|
Info
|
|||||||||
Start
|
Next
|
Next
|
Nulo
|
||||||||
Nulo
|
Prior
|
Prior
|
End
|
Por fim, mais três situações
podem ocorrer quando se remove um item na lista duplamente encadeada, repare
que como reflexo da inserção, a sequência de operação se inverte:
1.
Excluir o primeiro da lista;
Info
|
Info
|
Info
|
|||||||||
Start
|
Next
|
Next
|
Nulo
|
||||||||
Nulo
|
Prior
|
Prior
|
End
|
·
Copia o endereço de próximo no primeiro item
para Start.
·
Coloca endereço anterior nulo para o novo
primeiro item.
Info
|
Info
|
||||||||||
Start
|
Next
|
Nulo
|
|||||||||
Nulo
|
Prior
|
End
|
2.
Elimina numa posição intermediaria;
Info
|
Info
|
Info
|
|||||||||
Start
|
Next
|
Next
|
Nulo
|
||||||||
Nulo
|
Prior
|
Prior
|
End
|
·
Copia no item anterior ao que vai ser excluído o
endereço de próximo.
·
Copia no item próximo ao que vai ser excluído o
endereço de anterior.
Info
|
Info
|
||||||||||
Start
|
Next
|
Nulo
|
|||||||||
Nulo
|
Prior
|
End
|
3.
Excluir o ultimo item;
Info
|
Info
|
Info
|
|||||||||
Start
|
Next
|
Next
|
Nulo
|
||||||||
Nulo
|
Prior
|
Prior
|
End
|
·
Troca o endereço que aponta para o item a ser
excluído por nulo.
·
Copia o endereço de anterior do item a ser excluído
em End.
Info
|
Info
|
|||||||
Start
|
>
|
Next
|
Nulo
|
|||||
Nulo
|
Prior
|
End
|
Um modelo simples e didático de código
em linguagem C para uma lista duplamente encadeada está incluído na próxima postagem
“Exemplo de lista duplamente encadeada” e serve como complemento prático
mostrando a programação completa das rotinas para inserir, excluir e percorrer.
Gostaria de saber quais são os procedimentos para remover no inicio, meio e fim da lista duplamente encadeada ?
ResponderExcluirToda a didática feita para lista encadeada foi apresentada em quatro postagens em sequencia do grau de complexidade, comecei com lista singularmente encadeada, seguido de um código exemplo, a seguir cheguei nesta postagem (a terceira parte) em que apresentava o conceito de lista duplamente encadeada, que complementa o assunto iniciado anteriormente, como descrevi detalhadamente todo o processo de exclusão para lista singularmente encadeada, decidi que explicar somente à inclusão do ponteiro prévio na estrutura de dados, as operações de inserir e remover para lista duplamente encadeada está no código exemplo da postagem seguinte, aonde comento linha a linha o processo de exclusão.
ExcluirPode ser encontrada no endereço http://algoritmoconcreta.blogspot.com.br/2013/05/exemplo-de-lista-duplamente-encadeada.html