ALGORITMOS E ESTRUTURAS DE DADOS Bruno Silva
Listas Encadeadas Características: Tamanho da lista não é pré-definido Cada elemento guarda quem é o próximo Elementos não estão contíguos na memória info NULL Vetor x Listas: Vetor: tamanho pré-definido, sabe qual o próximo, contíguo na memória Lista: não tem tamanho pré-definido, cada um guarda quem é o próximo, espalhados pela memória Figura Cada elemento armazenado numa lista guarda um ponteiro para o próximo elemento. O último elemento da lista possui um ponteiro inválido, indicando o término da estrutura. Com isto, a partir do primeiro elemento e percorrendo-se os ponteiros, pode-se acessar todos os elementos da lista. Portanto, numa lista encadeada, as informações não estão armazenadas de forma contínua na memória. Cada informação tem seu espaço de memória e é ligada à outra através de um enlace (ponteiro). Cada elemento é uma estrutura: informações + próximo da fila. Filas e pilhas dividem características comuns: Primeiro, ambas têm regras específicas para referenciar elementos às estruturas de dados. Segundo, operações de restauração são por natureza destrutivas, isto é, acessar um elemento em uma pilha ou fila requer sua retirada. info NULL prox info prox info info NULL prox Algoritmos e Estrutura de Dados I
Sobre os Elementos da Lista Elemento: guarda as informações sobre cada elemento. Para isso define-se cada elemento como uma estrutura que possui: campos de informações ponteiro para o próximo elemento info prox Algoritmos e Estrutura de Dados I
Sobre a Lista Uma lista pode ter uma célula cabeça info prox NULL Último Uma lista pode ter um apontador para o último elemento Algoritmos e Estrutura de Dados I
Cria Lista Vazia NULL Cabeça Último Algoritmos e Estrutura de Dados I
Inserção de Elementos na Lista info prox NULL Último 3 opções de posição onde pode inserir: 1ª. posição última posição Após um elemento qualquer E Algoritmos e Estrutura de Dados I
Inserção na Primeira Posição info NULL prox prox info prox info prox info NULL Último Algoritmos e Estrutura de Dados I
Inserção na Última Posição prox info prox info prox info NULL info NULL prox Último Algoritmos e Estrutura de Dados I
Inserção Após o Elemento E info NULL prox prox info prox info prox info NULL Último Elem E Algoritmos e Estrutura de Dados I
Retirada de Elementos na Lista info prox NULL Último 3 opções de posição de onde pode retirar: 1ª. posição última posição Um elemento qualquer E Algoritmos e Estrutura de Dados I
Retirada do Elemento na Primeira Posição da Lista prox info prox info prox info NULL Último Algoritmos e Estrutura de Dados I
Retirada do Elemento E da Lista prox info prox info prox info NULL Anterior Elem E Último Algoritmos e Estrutura de Dados I
Retirada do Último Elemento da Lista prox info prox info prox info NULL NULL Anterior Último Algoritmos e Estrutura de Dados I
Estrutura da Lista Usando Apontadores typedef int TipoChave; typedef struct { int Chave; /* outros componentes */ } TipoItem; typedef struct Celula_str *Apontador; typedef struct Celula_str { TipoItem Item; Apontador Prox; } Celula; Apontador Primeiro; Apontador Ultimo; } TipoLista; Algoritmos e Estrutura de Dados I
Operações sobre Lista Usando Apontadores void IniciaVazia(TipoLista *Lista) { Lista->Primeiro = (Apontador) malloc(sizeof(Celula)); Lista->Ultimo = Lista->Primeiro; Lista->Primeiro->Prox = NULL; } int Vazia(TipoLista Lista) return (Lista.Primeiro == Lista.Ultimo); void Insere(TipoItem x, TipoLista *Lista) Lista->Ultimo->Prox = (Apontador) malloc(sizeof(Celula)); Lista->Ultimo = Lista->Ultimo->Prox; Lista->Ultimo->Item = x; Lista->Ultimo->Prox = NULL; Algoritmos e Estrutura de Dados I
Operações sobre Lista Usando Apontadores void Imprime(TipoLista Lista) { Apontador Aux; Aux = Lista.Primeiro->Prox; while (Aux != NULL) printf("%d\n", Aux->Item.Chave); Aux = Aux->Prox; } Algoritmos e Estrutura de Dados I
Operações sobre Lista Usando Apontadores Vantagens: Permite inserir ou retirar itens do meio da lista a um custo constante (importante quando a lista tem de ser mantida em ordem). Bom para aplicações em que não existe previsão sobre o crescimento da lista (o tamanho máximo da lista não precisa ser definido a priori). Desvantagem: Utilização de memória extra para armazenar os apontadores. Algoritmos e Estrutura de Dados I