21
Aula 14 Listas Duplamente Encadeadas prof Leticia Winkler 1

Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Embed Size (px)

Citation preview

Page 1: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Aula 14

Listas Duplamente Encadeadas

prof Leticia Winkler

1

Page 2: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Lista Duplamente Encadeada É um tipo de lista encadeada que pode ser vazia (NULL) ou que

pode ter um ou mais nós, sendo que cada nó possui dois ponteiros: um que aponta para o nó antecessor e outro que aponta para o nó sucessor.

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.

Uma lista duplamente encadeada pode ser circular ou não e ainda, pode estar em ordem (crescente/decrescente) ou não.

Prof. Leticia Winkler 2

último primeiro

Page 3: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Nó da Lista

Prof. Leticia Winkler 3

informação próximo

anterior

Page 4: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Lista Duplamente Encadeada vs. Lista Simplesmente Encadeada Uma primeira vantagem da utilização de lista duplamente

encadeada sobre a lista simplesmente encadeada é a maior facilidade para navegação, que na lista duplamente encadeada pode ser feita nos dois sentidos, ou seja, do início para o fim e do fim para o início.

Isso facilita a realização de operações tais como inclusão e remoção de nós, pois diminui a quantidade de variáveis auxiliares necessárias.

Se não existe a necessidade de se percorrer a lista de trás para frente, a lista simplesmente encadeada é a mais interessante, pois é mais simples.

Prof. Leticia Winkler 4

Page 5: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Lista Duplamente Encadeada vs. Lista Simplesmente Encadeada

Prof. Leticia Winkler 5

primeiro

último primeiro

atual

atual

Page 6: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Representação do Nó Um nó da lista é representado por uma estrutura (struct),

que deverá conter, no mínimo, três campos : um campo com a informação ou dado a ser armazenado e dois ponteiros: um para o próximo nó da lista e outro para o nó anterior.

É preciso que o primeiro nó seja apontado por um ponteiro, assim como o último, para que assim, a lista possa ser manipulada através de suas diversas operações.

Prof. Leticia Winkler

último primeiro

prox ant

Page 7: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Representação do Nó struct noDupla {

tipo info1;

tipo info2;

...

(struct) no *nomePonteiro1, *nomePonteiro2;

};

Exemplo:

struct noDupla {

int dado;

struct noDupla *prox; // ponteiro p/ à direita

struct noDupla *ant; // ponteiro p/ à esquerda

};

Prof. Leticia Winkler

prox 10 ant

Page 8: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Operações com Listas Duplamente Encadeadas Criação Inicialização Inserção (no início, no fim, após um determinado valor,

etc...) Percurso (mostrar a lista – de trás para frente; de frente

para trás) Substituição de um valor por outro Remoção (do primeiro nó, do último nó, de um nó em

particular, etc..) Busca ou pesquisa de forma sequencial Exemplos de aplicações com listas duplamente encadeadas:

todos os já mencionados para listas lineares.

Prof. Leticia Winkler 8

Page 9: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Criação e Inicialização da Lista Declara-se o ponteiro para o primeiro nó da lista e o

ponteiro para o último nó da lista. Aqui chamado de l2i e de l2f respectivamente.

// criação

noDupla *l2i; // ponteiro para o primeiro elemento da lista

noDupla *l2f; // ponteiro para o último elemento da lista

l2i = l2f = NULL; // inicialização

Prof. Leticia Winkler 9

l2i

l2f

Page 10: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Exemplo Construir uma lista com um nó apenas com o valor 10:

novo = new noDupla;

novo->dado = valor;

novo->prox = NULL;

novo->ant = NULL;

l2i = novo;

l2f = novo;

Prof. Leticia Winkler 10

Lista com um nó apenas

l2f

10

l2i

10

Page 11: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Exemplo Inserindo mais um nó na lista (antes do primeiro nó – inserir na frente)

novo = new noDupla;

novo-> dado = 20;

novo-> prox = l2i;

11

l2f l2i

10

20

l2f l2i

10

20

l2f l2i

10

novo

novo

novo

Page 12: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Exemplo Inserindo mais um nó na lista (antes do primeiro nó – inserir na frente)

l2i->ant = novo;

l2i = novo;

12

Lista com mais um nó

20

l2f l2i

10

novo

20

l2f l2i

10

Page 13: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Código da Inserção no Início void inserirInic(int valor) {

// cria um novo no

noDupla *novo = new noDupla;

novo->dado = valor;

novo->prox = NULL;

novo->ant = NULL;

// inserindo no inicio da lista

if (l2i != NULL) {

novo->prox = l2i;

l2i->ant = novo;

}

else

l2f = novo;

l2i = novo;

} Prof. Leticia Winkler 13

Page 14: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Remoção Retirada de um nó da lista

Antes deve-se verificar se a lista não está vazia.

Como se sabe se uma lista duplamente encadeada está vazia?

Prof. Leticia Winkler 14

Page 15: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Verificando se a Lista Encadeada está Vazia Verifica-se se o ponteiro para o primeiro elemento da

lista está apontando para algum nó

if (l2i == NULL) {

cout << "\nLista vazia!!!\n\n";

}

Ou, usando uma função:

bool estaVazia() {

return (l2i == NULL);

}

Prof. Leticia Winkler 15

Page 16: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Removendo o primeiro da Lista Guarda nó a ser removido através de um ponteiro

auxiliar

Ponteiro para o inicio da lista (primeiro) aponta para o próximo da lista

Prof. Leticia Winkler 16

20

l2f l2i

10

20

l2f l2i

10

aux

aux

Page 17: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Removendo o primeiro da Lista Ponteiro anterior do início da lista é aterrado

Remove nó apontado pelo auxiliar

Prof. Leticia Winkler 17

20

l2f l2i

10

aux

20

l2f l2i

10

aux

l2f l2i

10

Page 18: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Código da Remoção de um nó do Início noDupla* removerInic () {

noDupla *aux = l2i;

l2i = l2i->prox;

if (l2i == NULL) // se foi removido o ultimo elemento que existia na lista

l2f = NULL; // ultimo tb ficara apontando para nada

else

l2i->ant = NULL;

return aux;

}

Prof. Leticia Winkler 18

Page 19: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Percorrer a Lista (mostrar) Verifica-se se a lista não está vazia

Usando um ponteiro auxiliar (aqui chamado de atual) percorre-se a lista a partir do primeiro (l2i)

Move-se o ponteiro auxiliar pela lista:

atual= atual-> prox;

Prof. Leticia Winkler 19

atual

10 20 40

l2i

30

l2f

atual

10 20 40

l2i

30

l2f

Page 20: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Código para Percorrer (frente para traz) void percorrerFrenteTraz () { noDupla *atual; // ponteiro para percorrer a lista atual = l2i; cout << "\nLista => "; while (atual != NULL) { cout << atual->dado << "\t"; atual = atual->prox; } cout << endl; }

Prof. Leticia Winkler 20

Page 21: Aula 14 Listas Duplamente Encadeadas prof Leticia …rogerio/ed/13 - Listas Duplamente Encadeadas.pdf · interessante, pois é mais simples. Prof. Leticia Winkler 4 . Lista Duplamente

Exercício #1 Altere o programa listadupla.cc (está no SIA),

concluindo o trecho do código para:

Inserir um elemento no final da lista;

Remover o último da lista;

Remover determinado elemento da lista, cujo valor deve ser informado pelo usuário;

Percorrer de traz para frente.

Prof. Leticia Winkler 21