Baixe o app para aproveitar ainda mais
Prévia do material em texto
2. Listas encadeadas 0.2 Lista encadeada 2.1 Introdução à listas O objetivo deste capítulo é fazer voce entender a listas encadeadas. A implementação de acordo com as necessidades e o desempenho depende de você. Listas encadeadas podem ser usadas quando várias operações para inserção,remonçao e busca do elementos são necessárias. Definição : Uma lista encadeada é simplesmente uma lista de objetos do mesmo tipo em que cada elemento contém: · Informações relacionadas ao funcionamento do aplicativo, por exemplo nomes completos de pessoas com endereços e números de telefone para um livro de endereços. · O endereço do próximo item ou uma marca final, se não houver outro. É esse link através do endereço do próximo elemento contido no elemento precedente que cria a "cadeia" e permite encontrar cada elemento da lista. O endereço do seguinte objeto pode ser: · um endereço de memória recuperado com um ponteiro (encadeamento dinâmico). · um índice de matriz recuperado com um número inteiro · uma posição em um arquivo. Este é o número de série do objeto no arquivo multiplicado pelo tamanho do byte do tipo de objeto. É recuperado com um inteiro. Se a lista encadeada é construída com ponteiros ou números inteiros, é sempre o termo ponteiro usado: cada elemento "aponta" para o próximo elemento, ou seja, tem os meios para acessá-lo e uma lista encadeada pode ser representada assim: Cada quadrado corresponde a um elo da cadeia. O pequeno quadrado preto no topo left corresponde ao endereço na memória do elemento. A pequena volta às direita corresponde ao ponteiro que "aponta" no seguinte, ou seja, que contém o endereço do próximo item. No início, há o ponteiro da cabeça que contém o endereço do primeiro elemento, ou seja, o endereço da cadeia. 2.2 Lista simplesmente encadeada As listas simplesmente encadeadas são estruturas de dados semelhantes às tabelas, exceto que o acesso a um elemento não é feito por índice mas através de um ponteiro. . A alocação da memória é feita durante a execução. Em uma lista, os elementos são contíguos no que se refere ao encadeamento. Lista simplesmente encadeada pode ser representada assim: No entanto, em comparação com as tabelas, onde os elementos ficam contíguos na memória, os elementos de uma lista ficam espalhados na memória. A conexão entre os elementos se realiza por um ponteiro. Na verdade, na memória é aleatória, dependendo do espaço alocado.O ponteiro "seguinte" ao último elemento deve dirigir para o NULL (o fim da lista), e ara acessar um elemento, a lista é varrida começando do topo, o ponteiro "seguinte" permite o deslocamento para o elemento seguinte. O deslocamento se faz em um único sentido, do primeiro para o último elemento. Se você quiser deslocar nos dois sentidos (para frente/para trás) use as listas duplamente encadeadas. A construção de um elemento da lista simplesmente encadeada: Para definir um elemento da lista, o tipo de estrutura será usado. O item da lista conterá um determinado campo e um ponteiro a seguir. O próximo ponteiro deve ser do mesmo tipo que o elemento, caso contrário, não poderá apontar para o elemento. O ponteiro "próximo" permitirá acesso ao próximo elemento. typedef struct ElemetoLista { char *dado; struct ElementoLista *proximo; }Elemento; Para ter controle da lista, é preferível salvar certos elementos: o primeiro elemento, o último elemento, o número de elementos. Para conseguir isso, outra estrutura será usada (isso não é obrigatório, variáveis podem ser usadas). Aqui está sua composição: typedef struct ListaReferência { Elemento *inicio; Elemento *fim; int tamanho; }Lista; O ponteiro inicial conterá o endereço do primeiro item da lista. O ponteiro final conterá o endereço do último item da lista. A variável size contém o número de elementos. Qualquer que seja a posição na lista, os ponteiros inicial e final sempre apontam respectivamente para o primeiro e o último elemento. O campo tamanho conterá o número de elementos na lista, independentemente da operação executada na lista. 2.3 Lista duplamente encadeada Definição : Listas duplamente encadeada são estruturas de dados semelhantes a listas simplesmente encadeads. A alocação de memória é feita em tempo de execução. Por outro lado, em comparação com as listas encadeadas simplesmente, a conexão entre os elementos é feita graças a dois ponteiros (um que aponta para o elemento anterior e outro que aponta para o seguinte). Lista simplesmente encadeada pode ser representada assim: O ponteiro anterior do primeiro elemento deve apontar para NULL (o início da lista). O próximo ponteiro para o último elemento deve apontar para NULL (o final da lista). Para acessar um elemento, a lista pode ser percorrida nas duas direções: · começando com a cabeça, o próximo ponteiro permite o movimento para o próximo elemento. · começando com a cauda, o ponteiro anterior permite o movimento para o elemento anterior. Em resumo, o movimento é feito em duas direções, do primeiro ao último elemento e / ou do último ao primeiro elemento. A construção de um elemento da lista duplamente encadeada: Para definir um elemento da lista, o tipo de estrutura será usado. O item da lista conterá um determinado campo, um ponteiro anterior e um próximo ponteiro. Os ponteiros anteriores e seguintes devem ser do mesmo tipo que o elemento, caso contrário, não poderão apontar para um elemento na lista. O ponteiro "precedente" permitirá acesso ao elemento anterior, enquanto o ponteiro a seguir permitirá acesso ao próximo elemento. typedef struct dl_ElementoLista { char *dado; struct dl_ElementoLista *Anterior; struct dl_ElementoLista *Proximo; }dl_Elemento; Para ter controle da lista, é preferível salvar certos elementos: o primeiro elemento, o último elemento, o número de elementos. Para conseguir isso, outra estrutura será usada (isso não é obrigatório, variáveis podem ser usadas).qui está sua composição: typedef struct dl_Lista {dl_Elemento *inicio; dl_Elemento *fim; int tamanho; }dl_Lista; O ponteiro inicial conterá o endereço do primeiro item da lista. O ponteiro final conterá o endereço do último item da lista. A variável size contém o número de elementos. Qualquer que seja a posição na lista, os ponteiros inicial e final sempre apontam respectivamente para o primeiro e o último elemento. O campo tamanho conterá o número de elementos na lista, independentemente da operação executada na lista. 2.4 Lista circular Definição : A lista circular é um tipo de lista simples ou duplamente encadeada, que possui uma característica adicional para mover-se na lista: "ela não tem fim". Para tornar a lista infinita, o próximo ponteiro para o último elemento apontará para o 1º elemento da lista em vez do valor NULL, que vimos no caso de listas simples e duplamente encadeada. Nas listas circulares, nunca chegaremos a uma posição da qual não poderemos mais nos mover. Ao chegar ao último elemento, o movimento começará novamente no primeiro elemento. Em brevemente, é uma rotação. Lista circular pode ser representada assim:
Compartilhar