Baixe o app para aproveitar ainda mais
Prévia do material em texto
Listas encadeadas APRESENTAÇÃO Na estrutura de dados, as listas são normalmente utilizadas para relacionar itens que precisam ser exibidos ou manipulados por meio de estruturas estáticas ou dinâmicas. Diversas são as atividades que podem ser realizadas com listas e cada qual requer um tipo adequado, de acordo com os objetivos e as funcionalidades da aplicação. Ao conhecer essas estruturas, um profissional de TI será capaz de identificar o uso correto de cada tipo de lista, bem como poderá apresentar soluções confiáveis e otimizadas para o desenvolvimento de sistemas. Nesta Unidade de Aprendizagem, você vai estudar sobre formas de armazenamento em lista, listas com encadeamento simples e comparação entre listas encadeadas e estáticas. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Identificar formas de armazenamento em uma lista.• Reconhecer encadeamento simples em uma lista.• Comparar lista encadeada com lista estática.• DESAFIO Listas, de um modo geral, podem conter pequenas ou grandes relações de itens. As relações pequenas, independentemente da técnica utilizada, são manipuladas com baixo custo computacional por terem poucos itens. No entanto, relações grandes requerem a avaliação de técnicas apropriadas, com o objetivo de atender às demandas, usando adequadamente os recursos computacionais disponíveis, por meio de rotinas otimizadas que proporcionem melhor desempenho. Neste contexto, considere que você é o analista responsável pela análise de um processo computacional que requer a manipulação de uma relação com um milhão de registros. Essa relação está ordenada e deve permitir a inclusão de novos itens em qualquer posição, mantendo a ordem classificada. Por ser o responsável pelo processo, você tem autonomia para decidir qual o tipo de lista que deve ser empregado na solução, considerando as listas estáticas e dinâmicas. Assim, explique qual o tipo de lista é o mais recomendado para resolver esse problema e justifique sua indicação, apresentando os argumentos utilizados tanto para a escolha de uma quanto para a recusa da outra. INFOGRÁFICO Listas são estruturas largamente utilizadas em sistemas computacionais. Diversas atividades do mundo real podem ser representadas por listas, como a relação de produtos em estoque e a listagem de clientes inadimplentes, entre outras. Entre os tipos de listas que existem na estrutura de dados, a lista com encadeamento simples destaca-se por não ter uma quantidade limitada de itens e otimizar a memória do dispositivo, alocando apenas o espaço necessário para acomodar os elementos, bem como tem a capacidade de incluir e excluir itens de qualquer posição com baixo custo de processamento. Veja, no infográfico, a apresentação de uma lista com encadeamento simples. CONTEÚDO DO LIVRO Rotinas automatizadas, de um modo geral, utilizam listas para representar dados em séries ou para apresentar itens agrupados por determinada categoria, como a listagem de alunos matriculados em determinada disciplina ou a relação clientes com a mensalidade em dia de uma academia de ginástica. Conhecer as estruturadas de dados baseadas em listas representa um diferencial que todo profissional de TI deve ter, uma vez isso poderá auxiliá-lo na identificação e seleção de técnicas apropriadas para a solução dos problemas computacionais que fazem parte da rotina de programadores e desenvolvedores de sistemas. No capítulo Listas encadeadas, da obra Estrutura de dados, que é base teórica desta Unidade de Aprendizagem, você vai estudar sobre formas de armazenamento em listas, listas com encadeamento simples e comparação entre listas encadeadas e estáticas. ESTRUTURA DE DADOS Maurício Saraiva Listas encadeadas Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Identificar formas de armazenamento em uma lista. Reconhecer o encadeamento simples em uma lista. Comparar lista encadeada com lista estática. Introdução Na estrutura de dados, as listas são, geralmente, utilizadas para relacionar itens que precisam ser exibidos ou manipulados por meio de estrutu- ras estáticas ou dinâmicas. Diversas são as atividades que podem ser realizadas com listas e cada uma delas requer um tipo adequado, de acordo com os objetivos e funcionalidades da aplicação. Ao conhecer essas estruturas, um profissional de tecnologia da informação (TI) será capaz de identificar o uso correto de cada tipo de lista, bem como poderá apresentar soluções confiáveis e otimizadas para o desenvolvimento de sistemas. Neste capítulo, você estudará sobre formas de armazenamento em lista, listas com encadeamento simples e comparação entre listas enca- deadas e estáticas. Formas de armazenamento em uma lista Uma lista pode ser entendida como uma relação de itens que contém elementos de um tipo primitivo ou de um tipo abstrato de dados (TAD). Essa relação deve ser contínua e não pode conter elementos nulos nem espaços vazios que interrompam a sequência da lista (EDELWEISS; GALANTE, 2009). Listas, de um modo geral, são largamente utilizadas em sistemas com- putacionais, uma vez que representam diversas rotinas do mundo real e que podem ser automatizadas, como a relação de produtos em promoção de uma loja e a listagem de alunos adimplentes de uma academia. Diferente de filas e pilhas que possuem restrição no modo de inclusão e exclusão de itens, as listas são mais abrangentes e permitem adicionar e remover itens em qualquer posição e em qualquer ordem da relação, oferecendo, assim, grande utilidade em rotinas automatizadas (EDELWEISS; GALANTE, 2009). Na estrutura de dados, as listas podem ser classificadas em duas categorias: estáticas e dinâmicas, que apresentam diferentes particularidades e modos de operação, conforme você verá na sequência deste capítulo. Lista estática Uma lista estática é uma relação de itens armazenados em uma estrutura de tamanho fi xo, como um array. Nessa estrutura, a quantidade de elementos é reservada no momento de sua criação e o seu tamanho não pode ser redimen- sionado em tempo de execução (DEITEL; DEITEL, 2011). A alocação de memória de uma lista estática é sequencial, isto é, os itens estão localizados em posições contínuas da memória, o que permite a busca de elementos ser realizada diretamente em determinada posição, por meio de seu índice. No entanto, por mais que uma lista estática não ocupe todas as posições definidas na sua criação, os espaços de memória reservados por ela não po- derão ser ocupados por outra aplicação. Dessa forma, o programa não utiliza os recursos de memória de maneira eficiente, pois pode reservar mais que o necessário (MATTOS; LORENZI; CARVALHO, 2007). A Figura 1 apresenta uma lista que reserva 10 posições na memória, mas que ocupa apenas as quatro primeiras. Figura 1. Representação na memória de uma lista estática. 1 2 3 4 a b c d ... 5 10 Listas encadeadas2 A inclusão e a exclusão de itens no interior da lista podem ser custosas, ou seja, podem demandar mais recursos de processamento e demorar signi- ficativamente para concluir a tarefa em listas grandes, uma vez que todos os elementos, a partir do respectivo item incluído/excluído, devem ser reposicio- nados na lista (MATTOS; LORENZI; CARVALHO, 2007). As vantagens de uma lista estática são (FORBELLONE, 2005): agilidade nas consultas — acesso direto aos elementos por meio dos índices do array; tempo de acesso constante — a velocidade das pesquisas não reduz com o crescimento da lista. As desvantagens de uma lista estática são (FORBELLONE, 2005): array de tamanho fixo — a lista não pode aumentar nem diminuir em tempo de execução; custo de inclusão/exclusão de itens — o custo computacional é alto para realocar os itens quando algum elemento é incluído ou excluído da lista. Lista dinâmica Uma lista dinâmica realiza a alocação de memória em tempode execução para a acomodação de novos itens, isto é, reserva memória apenas quando precisa aumentar a lista e, quando reduz, libera a memória ocupada. Assim, o programa utiliza a memória de forma dinâmica, sem ocupar mais espaço que o necessário (DEITEL; DEITEL, 2011). Não existe um índice de acesso aos elementos de uma lista dinâmica. A lista mantém o endereço da posição inicial, sendo necessário percorrer os itens de forma sequencial para encontrar determinado elemento na relação. A relação entre os elementos de uma lista dinâmica se dá pelo uso de ponteiros de memória, ou seja, cada elemento possui um apontador para o endereço de memória de um ou mais elementos da lista, fazendo ela ficar ligada, sem ocupar posições contínuas na memória (CELES; CERQUEIRA; RANGEL, 2004). Observe a representação da Figura 2. 3Listas encadeadas Figura 2. Representação na memória de uma lista encadeada simples. Mapa da memória principal a b d e Lista: a -> b -> c -> d -> e -> f f c As vantagens de uma lista dinâmica são (FORBELLONE, 2005): crescimento e redução dinâmica — capacidade de crescer e reduzir a lista em tempo de execução; baixo custo de inserção e exclusão — ajusta o apontamento de memória em apenas dois elementos a cada modificação realizada (anterior e próximo); alocação dinâmica de memória — proporciona otimização da me- mória principal, usando apenas o espaço necessário para acomodar os elementos da lista; alocação eficiente — a alocação de endereços de memória é geren- ciada pelo sistema operacional por meio das funções da linguagem de programação. As desvantagens de uma lista dinâmica são (FORBELLONE, 2005): alto custo de pesquisa — não existe um índice de acesso direto, devendo realizar busca sequencial; tempo crescente de busca — o tempo gasto para encontrar elementos cresce de acordo com o tamanho da lista. Listas encadeadas4 “Não liberar memória alocada dinamicamente quando ela não mais for necessária pode fazer com que o sistema esgote prematuramente sua memória. Algumas vezes isso é chamado um vazamento de memória” (DEITEL; DEITEL, 2010, p. 552). Em estrutura de dados, as listas dinâmicas podem ser divididas em duas categorias: listas com encadeamento simples e listas com encadeamento duplo. Encadeamento simples Uma lista dinâmica baseada no encadeamento simples, ou simplesmente encadeada, é uma relação de itens organizados em sequência, cujos itens armazenam, além das informações do elemento, o endereço do próximo item da lista (CELES; CERQUEIRA; RANGEL, 2004). Nesse tipo de encadeamento, a varredura da lista ocorre apenas em uma direção, ou seja, da esquerda para a direita, sem a possibilidade de fazer o per- curso de volta. O último item da lista aponta para um endereço nulo, indicando que se encontra na última posição, conforme você pode observar na Figura 3. Figura 3. Lista simplesmente encadeada. a c e d b 5Listas encadeadas Encadeamento duplo Uma lista dinâmica que se baseia no encadeamento duplo, ou duplamente encadeada, é uma sequência de itens que apontam para dois endereços, além de armazenar o conteúdo do próprio elemento. Esses ponteiros correspondem aos endereços dos itens anterior e próximo na lista (CELES; CERQUEIRA; RANGEL, 2004). Por conter ponteiros que apontam para os elementos anterior e posterior, a varredura pode ocorrer em ambos os sentidos, isto é, tanto da esquerda para a direita como da direita para a esquerda. Os endereços anterior ao primeiro item e posterior ao último apontam para nulo, indicando que a lista inicia e termina neles, como você pode observar na Figura 4. Figura 4. Lista duplamente encadeada. a c e d b Encadeamento simples em uma lista Na seção anterior, você viu que, em uma lista simplesmente encadeada, cada elemento mantém um ponteiro para o próximo elemento da lista, o que faz a alocação ser dinâmica, uma vez que um novo espaço na memória será reservado apenas quando um elemento for inserido. A estrutura de um elemento em uma lista encadeada é dividida em três partes (Figura 5), conforme descrito a seguir (MATTOS; LORENZI; CAR- VALHO, 2007). Listas encadeadas6 &e1: representa o endereço do próprio elemento na memória. e1: significa o conteúdo do elemento, que pode ser apenas de um tipo primitivo ou um TAD. &prox: indica o endereço do próximo elemento da lista. Figura 5. Estrutura de um elemento de uma lista encadeada. &e1 &prox e1 O limite de elementos de uma lista dinâmica é determinado pela quantidade de memória que estiver disponível no dispositivo ou na máquina virtual que rodar o aplicativo. Para isso, a linguagem C fornece as funções malloc e free, para alocar e liberar recursos de memória em tempo de execução. A estrutura de uma lista simplesmente encadeada está ilustrada na Figura 6, na qual você pode visualizar que cada elemento aponta para o endereço do próximo item da lista, até que o último elemento aponta para nulo. Figura 6. Ilustração de uma lista encadeada. &e1 &prox e1 &e2 &prox e2 &e3 &prox e3 &e4 &prox e4 7Listas encadeadas Na linguagem C, uma lista simplesmente encadeada contendo o nome, a nota e a turma de um estudante pode ser declarada da seguinte forma: Note, na linha 9, que o atributo *prox da estrutura Nodo é declarado como uma estrutura de Nodo. Isso significa que esse atributo pode armazenar um endereço da mesma estrutura, que será utilizado para apontar para o próximo elemento da lista. No entanto, antes de criar um novo elemento, é preciso realizar a alocação de memória, que é feita a partir do tamanho base da estrutura em conjunto com a instrução malloc. Após a alocação, deve-se fazer o apontamento, isto é, dizer quem aponta para ele e para quem ele aponta. O exemplo a seguir insere o novo elemento na primeira posição da lista. Para inserir um elemento no final da lista, basta percorrê-la até a última posição e realizar o apontamento do novo item que foi criado. Lembre-se que o próximo do último elemento é NULL, pois ele não aponta para ninguém. Listas encadeadas8 A impressão da lista é realizada de forma parecida com a inclusão no final, ou seja, é preciso percorrer todos os elementos, desde o início até que o último elemento aponte para NULL. O deslocamento na lista se dá pelo acesso ao endereço do próximo item. Por fim, deve-se liberar os recursos de memória alocados. Para isso, você deve fazer uma varredura na lista e liberar cada elemento por meio da ins- trução free. Comparar lista estática e lista encadeada Na estrutura de dados, listas estáticas apresentam comportamentos diferentes de listas encadeadas. Para ambas as listas existem vantagens e desvantagens na sua utilização, e o tipo de lista a ser escolhido vai depender das caracte- rísticas da aplicação. As principais operações, que diferenciam uma lista estática de uma lista encadeada são a inserção e a exclusão, conforme apresentado a seguir. Inserção de item A inclusão de um elemento em uma lista estática pode fazer alguns elementos da lista terem que ser reposicionados. Isso provoca deslocando dos elemen- tos à direita do novo item para abrir espaço para a sua inserção, conforme demonstrado na Figura 7. 9Listas encadeadas Figura 7. Inclusão de item da lista estática. x x 1 2 3 4 5 a b c d e a b dc e 6 1 2 3 4 5 6 A inclusão de um elemento em uma lista dinâmica é realizada pelo en- cerramento da conexão entre os itens que estavam ligados, fazendo o item anterior apontar para o novo elemento e este apontar para o item posterior, conforme apresentado na Figura 8. Figura 8. Inclusão de item da lista dinâmica. a d c eb x a d c eb x Listas encadeadas10 Exclusão de item Assim como na inclusão de um item em uma lista estática, a exclusão de um elemento pode fazer alguns itens da lista terem que ser reposicionados. Assim, ocorre o deslocando dos elementos à direita do item retirado para fechar o espaço antes ocupado, conforme ilustrado na Figura 9. Figura9. Exclusão de item da lista estática. 1 2 3 4 5 6 1 2 3 4 5 6 a b c d e a b c d e A exclusão de um elemento em uma lista dinâmica encerra as ligações anterior e posterior do item que foi excluído, religando seu antecessor ao seu sucessor. Além disso, ocorre a liberação da memória que estava alocada para o item que foi excluído, conforme demonstrado na Figura 10. Figura 10. Exclusão de item da lista dinâmica. a b c d e a b d e 11Listas encadeadas O Quadro 1 apresenta um resumo comparativo das diferenças entre as listas estáticas e encadeadas, com base nas características e operações de cada uma delas. Evento Lista estática Lista encadeada Pesquisa pela posição A pesquisa é rápida, com acesso direto ao item por meio do índice do array. O tempo de busca é constante, independentemente do tamanho da lista. A pesquisa é mais lenta porque é sequencial, sempre partindo do primeiro elemento da lista. O tempo de busca considera a posição do elemento a ser buscado e o tamanho da lista. Pesquisa por conteúdo Essa pesquisa não usa o índice do array. Assim, precisa percorrer a lista sequencialmente até encontrar o item cujo conteúdo é igual ao pesquisado. O desempenho é semelhante porque também precisa percorrer a lista sequencialmente, desde a primeira posição até encontrar o item pesquisado. Inserção no meio da lista É mais lenta porque precisa reposicionar os itens à direita do elemento inserido. É mais rápida porque modifica os apontadores de dois itens apenas, o anterior e o posterior do item inserido. Inserção no final da lista É mais rápida porque acessa diretamente a próxima posição livre por meio do índice do array. É um pouco mais custosa porque precisa percorrer toda alista até chegar à última posição antes de inserir. Exclusão no meio da lista É mais lenta porque precisa reposicionar os itens à direita do elemento excluído. É mais rápida porque modifica os apontadores de dois itens apenas, o anterior e o posterior do item excluído. Exclusão no final da lista É rápida porque acessa diretamente a última posição por meio do índice do array. É um pouco mais lenta porque precisa percorrer toda a lista até chegar à última posição antes de excluir. Tamanho da lista Limitado e definido no mo- mento da declaração. Pode não ocupar todas as posições reser- vadas e consumir memória sem necessidade. O limite é o tamanho da memória livre no equipamento. Consome apenas o necessário para acomo- dar os itens e aloca ou libera con- forme a lista cresce ou diminui. Indicação de uso Listas pequenas, com quantidade limitada de itens, cujas inserções/ exclusões são raras e ocorrem normalmente no final da lista. Listas grandes, sem limite defi- nido de itens, que tendem a re- ceber mais inserções/exclusões de elementos. Quadro 1. Resumo comparativo. Listas encadeadas12 CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a estrutura de dados. São Paulo: Campus, 2004. DEITEL, P. J.; DEITEL, H. M. C: como programar. 6. ed. Rio de Janeiro: Pearson, 2011. EDELWEISS, N.; GALANTE, R. Estrutura de dados. Porto Alegre: Bookman, 2009. (Série Livros Didáticos Informática UFRGS, v. 18). FORBELLONE, A. L. Lógica de programação: a construção de algoritmos e estruturas de dados. 3. ed. São Paulo: Pearson, 2005. MATTOS, P.; LORENZI, F.; CARVALHO, T. Estruturas de dados. São Paulo: Thomson, 2007. 13Listas encadeadas Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. Conteúdo: DICA DO PROFESSOR Listas são largamente utilizadas em sistemas computacionais, podendo representar diversas atividades do mundo real. No entanto, um profissional atento deve levar em consideração a forma como as listas são manipuladas, uma vez que o desempenho de uma rotina informatizada pode variar de acordo com o tipo de lista empregado. Assista ao vídeo para conhecer as principais diferenças entre os tipos de listas em estrutura de dados. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) Baseando-se no conceito de lista dinâmica encadeada, marque a alternativa correta em relação à inclusão de elementos: A) A inclusão de elementos deve ocorrer no início da lista. B) A inclusão de elementos deve ocorrer no final da lista. C) A inclusão de elementos deve ocorrer em qualquer posição da lista. D) A inclusão de elementos deve ocorrer em uma posição que esteja vazia. E) O número máximo de elementos a serem incluídos é definido no momento de sua criação. 2) Em relação às listas simplesmente encadeadas, leia as alternativas a seguir e indique a correta: A) São rápidas para encontrar um elemento e lentas para incluir ou excluir. B) Cada elemento aponta para o endereço dos elementos anterior e sucessor. C) Armazenam os dados em posições contínuas na memória para agilizar a busca sequencial. Uma lista encadeada não tem um limite máximo de itens, pois a alocação é feita em tempo de execução, sendo que o limite é o tamanho da memória disponível no equipamento. Deve, ainda, permitir a inclusão em qualquer posição da lista, que fará a nova ligação para mantê-la encadeada. D) Alocam apenas a memória necessária para armazenar os elementos da lista. E) Uma vantagem é o tempo constante de busca de elementos. 3) Marque a alternativa correta em relação às vantagens de uma lista dinâmica: A) Permitem aumento e redução do tamanho da lista em tempo de execução. B) Alocam posições contínuas de memória no momento da criação. C) Baixo custo computacional para realizar pesquisa por meio dos índices. D) São rápidas para inserir porque a inserção sempre ocorre no final da lista. E) Utilizam arrays para armazenar o endereço de memória dos demais itens da cadeia. 4) Analise o seguinte código baseado na linguagem C e marque a alternativa que representa o seu significado: nodo *item= (nodo *) malloc(sizeof(nodo)); nodo *no= L->prox; while(no->prox != NULL) { no= no->prox; } no->prox = item; A) Adiciona um novo elemento no início da lista. B) Adiciona um novo elemento no final da lista. C) Remove o primeiro elemento da lista. D) Remove o próximo elemento da lista. E) Remove o último elemento da lista. Levando em consideração os conceitos de uma lista simplesmente encadeada, assinale 5) Uma lista simplesmente encadeada aponta apenas para o elemento posterior da cadeia, cuja pesquisa é sequencial. Por isso, é mais lenta para encontrar elementos, visto que seu tempo de busca é crescente e varia conforme a quantidade de itens da lista. No entanto, é rápida para inserir/excluir e não requer posições contínuas na memória, pois a alocação é dinâmica e otimizada, utilizando apenas o necessário Uma lista simplesmente encadeada aponta apenas para o elemento posterior da cadeia, cuja pesquisa é sequencial. Por isso, é mais lenta para encontrar elementos, visto que seu tempo de busca é crescente e varia conforme a quantidade de itens da lista. No entanto, é rápida para inserir/excluir e não requer posições contínuas na memória, pois a alocação é dinâmica e otimizada, utilizando apenas o necessário O código descrito faz uma varredura na lista até chegar à última posição. Na sequência, faz o último item apontar para o elemento que foi criado (*item). Portanto, adiciona um novo elemento no final da lista. a alternativa que melhor representa a sua utilização: A) Listas pequenas com raras inserções. B) Listas com um tamanho definido, como a relação de UFs do Brasil. C) Listas grandes, com muitas inserções e em qualquer posição. D) Listas que requerem pesquisa indexada. E) Listas que precisam ser percorridas em qualquer direção. NA PRÁTICA Aqui, é apresentado um TAD do tipo lista, composto dos seguintes atributos: nome, nota e turma, que compreendem o cadastro de alunos de uma disciplina. Para administrar essa estrutura, cria-se uma lista simplesmente encadeada, quepode receber inúmeros elementos, a qual implementará os seguintes métodos de acesso: acrescentar elemento no início, no meio e no final, imprimir e desalocar os itens da memória. A definição da estrutura Aluno e da lista está descrita a seguir: Uma lista simplesmente encadeada é recomendada para listas grandes, que podem ter muitas inserções e exclusões, cujo tamanho pode ser indefinido. No entanto, não apresentam pesquisa indexada, e a varredura ocorre apenas em uma direção. SAIBA + Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Lista Dinâmica Duplamente Encadeada Parte 1 - Definição Assista ao vídeo para saber mais sobre como implementar uma Lista Dinâmica Encadeada. Conteúdo interativo disponível na plataforma de ensino! Lista Dinâmica Encadeada Parte 2 – Implementação Assista ao vídeo para saber mais sobre como implementar uma Lista Dinâmica Encadeada. Conteúdo interativo disponível na plataforma de ensino! Remoção na Lista Dinâmica Assista ao vídeo para saber mais sobre como remover itens de uma Lista Dinâmica Encadeada. Conteúdo interativo disponível na plataforma de ensino!
Compartilhar