Listas Encadeadas Prof. Frederico Brito Fernandes [email protected] CONTEÚDO (1) Motivação (2) Definição (3) Operações (4) Comparando Vetores e Listas Ligadas (5) Lista Circular (6) Lista Duplamente Encadeada (1) Motivação Motivação... • Prever o número máximo de elementos no vetor durante a codificação – dimensionar o vetor com um número absurdamente alto • isto levaria a um desperdício de memória que é inaceitável em diversas aplicações RESERVAS AÉREAS nome nome nome nome e-ticket e-ticket e-ticket e-ticket 1 2 0 3 ... nome e-ticket 699 • E se tivermos mais de 700 reservas simultâneas? Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 2 (1) Motivação Solução • Algumas aplicações requerem a inserção/deleção constantes de elementos • Solução: – Usar listas ligadas Dado Dado Dado Dado / Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 3 (2) Definição Listas • Uma lista é uma estrutura de dados dinâmica. • O número de nós de uma lista pode variar consideravelmente à medida que elementos são inseridos ou removidos. • A natureza dinâmica de uma lista pode ser comparada à natureza estática de um vetor, cujo tamanho permanece constante. Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 4 (2) Definição Lista Simplesmente Encadeada • É uma estrutura de dados concreta que consiste de uma seqüência de nós • Cada nó armazena dado nó – O conteúdo do elemento – Uma ligação para o próximo nó A Estrutura, Pesquisa e Ordenação de Dados B próximo C Frederico Brito Fernandes D 5 (2) Definição O tipo Nó • Possui os campos de informação • Possui um campo de ligação com o próximo elemento do tipo Nó • As operações sobre nó são: – – – – Atualiza informação Atualiza próximo Recupera informação Recupera próximo Estrutura, Pesquisa e Ordenação de Dados dado Frederico Brito Fernandes próximo nó 6 (2) Definição Exemplo: Reserva Aérea • Ex: main(){ tReserva *cabeca, *segundoNo, *terceiroNo; cabeca = (tReserva *) malloc(sizeof(tReserva)); cabeca->prox = NULL; #include <stdlib.h> #include <stdio.h> typedef struct eReserva { char nome[60]; char e_ticket[20]; struct eReserva *prox; } tReserva; segundoNo = (tReserva *) malloc(sizeof(tReserva)); cabeca->prox = segundoNo; segundoNo->prox = NULL; struct eReserva nome e-ticket terceiroNo = (tReserva *) malloc(sizeof(tReserva)); segundoNo->prox = aux; terceiroNo->prox = NULL; NULL } tReserva cabeca segundoNo nome e-ticket Estrutura, Pesquisa e Ordenação de Dados prox nome terceiroNo e-ticket Frederico Brito Fernandes prox nome e-ticket NULL 7 (2) Definição O tipo Lista Encadeada • Possui um campo que referencia o início da lista (também chamado de cabeça da lista) • Possui um campo que representa o número total de nós da lista. • As operações sobre lista encadeada são: – – – – – – Inserir nó no início Inserir nó no fim Inserir nó no meio Remover nó no início Remover nó no fim Remover nó no meio Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 8 (3) Operações Inserir nó no início da lista 1. Aloque um novo nó 2. Faça o campo próximo do novo nó apontar para o nó cabeça da lista 3. Atualize o campo que aponta para a cabeça para apontar para o novo nó Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 9 (3) Operações Inserir um nó no fim da lista 1. Localize a cauda da lista 2. Aloque um novo nó 3. Faça o campo próximo do novo nó apontar para null 4. Faça o campo próximo do nó cauda apontar para o novo nó Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 10 (3) Operações Inserir um nó no meio da lista 1. Use uma variável auxiliar do tipo Nó para localizar o nó “V” após o qual se deseja inserir o novo nó 2. Aloque um novo nó 3. Faça o campo próximo do novo nó apontar para o nó apontado pelo campo próximo do nó “V” 4. Faça o campo próximo do nó “V” apontar para o novo nó V Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 11 (3) Operações Remover um nó da cabeça da lista 1. Use uma variável auxiliar do tipo Nó para apontar para a cabeça da lista 2. Atualize o campo que aponta para a cabeça da lista para apontar para o próximo nó na lista 3. Desaloque o nó da variável auxiliar. Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 12 (3) Operações Remover um nó da cauda da lista 1. 2. 3. 4. Use uma variável auxiliar do tipo Nó para localizar o penúltimo nó da lista Use uma outra variável auxiliar do tipo Nó para apontar para a cauda da lista Coloque o campo próximo do penúltimo nó da lista para null Desaloque o último nó Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 13 (3) Operações Remover um nó do meio da lista 1. Use uma variável auxiliar do tipo Nó para localizar o nó anterior “V” ao nó a ser removido da lista 2. Use uma outra variável auxiliar do tipo Nó para apontar para o nó “W” a ser removido da lista 3. Faça o campo próximo do nó “V” apontar para o nó apontado pelo campo próximo do nó a ser removido da lista 4. Desaloque o nó “W” V Estrutura, Pesquisa e Ordenação de Dados W Frederico Brito Fernandes 14 (4) Comparando vetores e listas ligadas Forma de acesso • Um item é acessado numa lista encadeada, percorrendo-se a lista a partir do início, porque não existe relação entre a posição de memória ocupada por um elemento de uma lista e sua posição dentro dessa lista. • Um item é acessado num vetor através de uma única operação (usando o índice) Dado Dado Dado Dado 0 1 2 3 Dado Dado Dado Dado / Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 15 (4) Comparando vetores e listas ligadas Flexibilidade • Por outro lado o vetor não é uma estrutura de dados muito flexível – É preciso dimensioná-lo com um número máximo de elementos – Se o número de elementos que precisarmos armazenar exceder a dimensão do vetor, teremos um problema – Se o número de elementos que precisarmos armazenar no vetor for muito inferior à sua dimensão, estaremos subutilizando o espaço de memória reservado – Se precisarmos retirar ou inserir um elemento no meio do vetor, teremos de deslocar alguns elementos do vetor Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 16 (5) Lista Circular Lista Circular • O campo próximo do último nó aponta de volta para o primeiro nó, em vez de apontar para null. • Não tem um "primeiro" ou um "último" nó natural. É preciso estabelecer um primeiro e um último nó por convenção. – Uma variável auxiliar do tipo Nó aponta para o último nó e o nó seguinte se torna o primeiro nó – Se a variável auxiliar do tipo Nó apontar para null então a lista circular está vazia Dado Dado Dado Dado Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 17 (5) Lista Circular Lista Circular - Limitações • Não se pode atravessar uma lista desse tipo no sentido contrário • Para eliminar um nó de uma lista circularmente ligada, é preciso usar pelo menos uma variável auxiliar do tipo Nó – A solução é usar Lista Duplamente Encadeada Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 18 (6) Lista Duplamente Encadeada Lista Duplamente Encadeada • O encadeamento simples também dificulta a retirada de um elemento da lista – Temos que percorrer a lista, elemento por elemento, para encontrarmos o elemento anterior àquele que queremos eliminar. • A solução é usar uma lista duplamente encadeada Dado Dado Dado Dado Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 19 (6) Lista Duplamente Encadeada Lista Duplamente Encadeada ant • Cada nó armazena : – O conteúdo do elemento – A ligação para o próximo nó – A ligação para o nó anterior Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes prox dado nó 20 (6) Lista Duplamente Encadeada Inserir novo elemento na lista p A B C p A B C X p A Estrutura, Pesquisa e Ordenação de Dados B Frederico Brito Fernandes q q X C 21 (6) Lista Duplamente Encadeada Remover elemento na lista p A B C A B C D p E E D A Estrutura, Pesquisa e Ordenação de Dados B C Frederico Brito Fernandes E 22 (6) Lista Duplamente Encadeada Exercício • Escreva o pseudo-código para as operações de inserir e remover um elemento em lista duplamente encadeada Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 23