Algoritmos e Estruturas de Dados I IEC012 Listas Encadeadas Prof. César Melo Todos os créditos reservados ao professor Leandro Galvão Listas Encadeadas ❖ Listas encadeadas ou listas ligadas representam uma seqüência de objetos na memória do computador. ❖ Exemplo: Lista de afazeres 1. Comprar uma lâmpada 2. Trocar uma lâmpada queimada 3. Procurar uma conta no quarto 4. Pagar uma conta na internet 5. Desligar o computador 6. Dormir Listas Encadeadas ❖ Na lista de afazeres anterior, uma tarefa dependia da execução da tarefa anterior Ação atual Próxima ação Listas Encadeadas 1. 2 Comprar lâmpada 2. Trocar lâmpada 3 3. Procurar conta 4 4. Pagar conta 5 5. Desligar micro 6 6. Dormir fim Listas Encadeadas :: Representação por vetores ❖ Como representar a lista anterior em um programa escrito na Linguagem C? ◗ Primeira opção: vetores ou matrizes Tarefa: Índice: Comprar Trocar Procurar lâmpada lâmpada conta 1 2 3 Pagar conta 4 Desligar micro 5 Dormir 6 Listas Encadeadas :: Representação por vetores ❖ Primeira opção: vetores ou matrizes ◗ Como acrescentar “Ligar micro”? Tarefa: Índice: Comprar Trocar Procurar lâmpada lâmpada conta 1 2 3 Pagar Ligar micro conta 4 Desligar micro 5 Dormir 6 7 Listas Encadeadas :: Representação por vetores ❖ Primeira opção: vetores ou matrizes ◗ Os itens da lista são armazenados em posições contíguas de memória. ◗ A lista pode ser percorrida em qualquer direção. ◗ A inserção de um novo item pode ser realizada após o último item com custo constante. ◗ A inserção de um novo item no meio da lista requer um deslocamento de todos os itens localizados após o ponto de inserção. ◗ Retirar um item do início da lista requer um deslocamento de itens para preencher o espaço deixado vazio. Listas Encadeadas :: Representação por ponteiros ❖ Segunda opção: ponteiros ◗ Estruturas de dados dinâmicas: estruturas de dados que contém ponteiros para si próprias. struct lista { char nome_tarefa[30]; float duracao; char responsavel[30]; ... struct lista *prox; }; ponteiro para a própria estrutura lista Listas Encadeadas :: Representação por ponteiros ❖ Representação gráfica de um elemento da lista: campos de informação próximo nó ◗ Cada item é encadeado com o seguinte, mediante uma variável do tipo ponteiro. ◗ Permite utilizar posições não contíguas de memória. ◗ É possível inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista. Listas Encadeadas :: Representação por ponteiros ❖ Cada item em particular de uma lista pode ser chamado de elemento, nó, célula, ou item. ❖ O apontador para o início da lista também é tratado como se fosse uma célula (cabeça), para simplificar as operações sobre a lista. ❖ O símbolo / representa o ponteiro nulo (NULL), indicando o fim da lista. p 3 5 2 4 / 162 Operações sobre lista encadeada ❖ Podemos realizar algumas operações sobre uma lista encadeadas, tais como: ◗ Inserir itens; ◗ Retirar itens; ◗ Buscar itens. ❖ Para manter a lista ordenada, após realizar alguma dessas operações, será necessário apenas movimentar alguns ponteiros (de um a três elementos). Operações sobre lista encadeada ❖ Outras operações possíveis: ◗ Criar uma lista ◗ Destruir uma lista ◗ Ordenar uma lista ◗ Intercalar duas listas ◗ Concatenar duas listas ◗ Dividir uma lista em duas ◗ Copiar uma lista em outra Operações sobre lista encadeada :: Inserção de itens ❖ Podemos inserir itens: ◗ No começo de uma lista ◗ No final de uma lista ◗ No meio de uma lista Operações sobre lista encadeada :: Inserção de itens no início ❖ O endereço armazenado no ponteiro p deve ser alterado para o endereço do item a ser acrescido à lista. p 5 2 4 / 3 163 Operações sobre lista encadeada :: Inserção de itens no final ❖ O endereço armazenado em p será alterado caso a lista esteja vazia ou ❖ O campo prox do último item será alterado. / p 3 p 3 / 5 / 164 Operações sobre lista encadeada :: Inserção de itens no meio ❖ Campo prox do item a ser inserido recebe o campo prox do item posterior ❖ Campo prox do item antecessor recebe o endereço do item a ser inserido p 3 2 4 / 5 165 Operações sobre lista encadeada :: Remoção de itens no início ❖ O endereço armazenado no ponteiro p deve ser alterado para o endereço do item que segue o primeiro item da lista. p 5 2 4 / 166 Operações sobre lista encadeada :: Remoção de itens no final ❖ O campo prox do último item será alterado caso a lista contenha mais de um item ou ❖ O endereço armazenado em p será alterado para NULL. p 3 p 3 / 5 / / 167 Operações sobre lista encadeada :: Remoção de itens no meio ❖ Item antecessor recebe o campo prox do item a ser removido p 3 5 2 4 / 168 Questões Um outro exemplo ❖ O programa abaixo... 169 Outros tipos de Listas Encadeadas ❖ Existem ainda outras variações de lista encadeada, dentre elas: ◗ Listas Duplamente Encadeadas ◗ Listas Circulares Listas Duplamente Encadeadas ❖ Cada elemento da lista é ligado a seu sucessor e a seu predecessor. ❖ Possibilita um trajeto em ambos os sentidos, simplificando o gerenciamento da lista. Listas Duplamente Encadeadas ❖ A estrutura de dados de um nó de uma lista duplamente encadeada recebe um novo campo: um ponteiro para o nó antecessor. typedef struct Elementar TElementar; struct elementar { int nro; TElementar *ant; TElementar *prox; }; 170 Listas Duplamente Encadeadas ❖ Vantagens: ◗ Facilitar as operações de manuseio dos elementos da lista; ◗ Caminhar em ambas as direções ❖ Desvantagem: ◗ Espaço a mais para armazenar um outro ponteiro; ❖ Considere as operações de inserção, inserção ordenada, e remoção; 170 Listas Circulares ❖ São listas encadeadas cujo fim aponta para o seu início, formando um círculo que permite uma trajetória contínua na lista. Podem ser: ◗ Singularmente encadeadas ◗ Duplamente encadeadas Listas Circulares ❖ A estrutura de um nó de uma lista circular permanece a mesma. Dependerá apenas se o encadeamento da lista é duplo ou singular. ❖ O que modifica é que não há mais necessidade de dois ponteiros para indicar o início e o fim da lista. ❖ Basta marcar um nó da lista para evitar loops. 171 Exercício ❖ Considere o seguinte problema que deve ser implementado usando lista encadeada; ◗ Uma sequência de números Deve ser armazenada em uma lista; ◗ Pede-se que os elementos dessa lista sejam impressos na ordem inversa com que estão encadeado na lista; ◗ Ao examinar a sua implementação, indique a que se assemalha a dinâmica de inclusão dos elementos. 171 Questões