Estrutura de
Dados
Listas Duplamente Encadeadas
Lista Duplamente Encadeada
É um tipo de lista encadeada que pode ser vazia ou que pode ter
um ou mais nós, sendo que cada nó possui dois ponteiros: um que
aponta para o nó anterior e outro que aponta para o próximo nó.
O importante é que, neste tipo de lista, o ponteiro externo pode apontar
para qualquer nó da lista, pois é possível caminhar para a direita ou para
a esquerda com igual facilidade.
No
Ponteiro Anterior.
Ponteiro Próximo.
Lista Duplamente Encadeada
No1 No 2 No 3 No 4
Em uma lista duplamente
encadeada é possível
percorrer a lista em ambas
as direções.
Também apresenta uma
maior segurança do que
uma lista simplesmente
encadeada uma vez que,
existe sempre dois ponteiros
apontando para cada registro.
                        Implementando:
Struct Tpreg{
       char nome[25];
       void *ant,*depois;
};
typedef struct Tpreg registro;
registro *Auxiliar,*Anterior, *Atual,*Proximo;
Auxiliar = Inicio = Fim = Anterior = NULL;
registro* busca(){
      char nomeE[];
      int achou = 0;
      scanf("%s", nomeE);
      Anterior = Atual->ant;
      while(Atual != NULL && achou == 0){
            if(strcmp( nomeE,Atual->nome)==0){
                  achou = 1;
            }else{
    if(strcmp( nomeE,Atual- >nome)>0){                 
                        Atual = Anterior;   
                        Anterior = Atual->ant;   
                 }else{   
                        Atual=Atual->prox;   
                        Anterior = Atual->ant;   
                 }   
      }   
}   
return Atual; }
                 
Custo da busca total:
O(n) pois a busca é do
tipo sequencial.
                                 Busca
Nome
“C3”
Nome
“C3”
Nome
“C3”
No (n-3)
Nome
“C1”
No (n-2)
Nome
“C2”
No (n-1)
Nome
“C3”
No n
Nome
“...”
A função busca ira varrer a lista, iniciando
do ultimo registro adicionado, ate ser
encontrado o nome digitado pelo usuário
em um dos elementos da lista.
Caso o nome não seja encontrado na lista
a função ira retornar “NULL”. Observe que
a lista esta ordenada alfabeticamente.
Nome digitado
pelo usuário.
Ponteiro Atual
                                 Inserção
No (n-3)
Nome
“C1”
No (n-1)
Nome
“C3”
No n
Nome
“...”
No (n-2)
Nome
“C2”
Novo elemento.
Ponteiro Anterior Ponteiro Atual
void inserir(){
char nomeE[25];
Auxiliar = (registro *) malloc (sizeof(registro));
scanf("%s", Auxiliar→nomeE);
Auxiliar→prox = NULL;
Auxiliar→ant = NULL;
if(Atual == NULL){
Atual = Auxiliar;
}else{
Anterior = Atual->ant;
while(Atual != NULL){
if(strcmp( nomeE,Atual->nome)>0 && strcmp( nomeE,Anterior->nome)<0){
Anterior->prox=Auxiliar;
Auxiliar->ant = Anterior;
Atual->ant = Auxiliar;
Auxiliar->prox = Atual;
}else if( strcmp( nomeE,Anterior->nome)>0){
Atual = Anterior;
Anterior = Atual->ant;
}else{
Atual = Atual->prox;
Anterior = Atual->ant;
}
}
}
...
Remoção
No (n-3)
Nome
“C”
No (n-2)
Nome
“C#”
No (n-1)
Nome
“C++”
Deletado
Nome
“Java”
No n
Nome
“...”
void remover(){
Atual = Busca();
if(Atual ->ant ==NULL)
Proximo = Atual->prox;
free(Atual);
Proximo->ant = NULL;
}else{
if(Atual->prox==NULL){
Anterior = Atual->ant;
free(Atual);
Anterior->prox =NULL;
}
else{
Anterior = Atual->ant;
Anterior ->prox = Atual->prox;
Proximo = Atual->prox;
Proximo->ant = Anterior;
free(Atual);
}
Lista Sequencial Duplamente encadeada
Uma Lista Sequencial Duplamente encadeada implementada em vetores, em
que uma coluna indica qual o dado anterior e outra coluna que indica qual é o
proximo e a posição é o índice.
                       Aplicações: 
A lista duplamente encadeada é bem 
utilizada em situações em que a navegação é 
feita nos dois sentidos.
Situações:
●Um reprodutor de músicas.
●Estoque de um mercado.
●Gerenciamento de contas de um banco.
●Redes sociais.
Participantes
•DANIELLE TAYNARA DOS SANTOS SILVA
•FELIPE ANTONIO SCHERER DIAS
•JOAO MARCOS DE OLIVEIRA RODRIGUES
•JOAO MARCELO DOS SANTOS NASCIMENTO
•JOAO VITOR RIBEIRO VIANA 
• JOSE VALMIR DE ARAUJO FILHO
•JUSTINO BISPO NETO
•MATHEUS SANTOS ALMEIDA
•THOMÉ PEREIRA ALVES NETO 
•WELERSON AUGUSTO LINO DE JESUS MELO 
Fonte:
●
Szwarcfiter, J. L.; Markenzon, L. ESTRUTURA DE DADOS E SEUS ALGORITMOS. 3ª ed.
Rio de Janeiro: LTC, 2010. 318 p.
●
Celes, Waldemar et al. INTRODUÇÃO A ESTRUTURA DE DADOS: COM TÉCNICAS DE
PROGRAMAÇÃO EM C. 2ª ed. Rio de Janeiro: Elsevier, 2004. 410 p.

Lista Duplamente Encadeada

Notas do Editor