Estruturas de Dados I

Documentos relacionados
Estruturas de Dados II

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Estrutura de Dados Listas

Listas Lineares. continuando...

Lista: conceito, representação e algoritmos

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Aula 11 Pilha Dinâmica. prof Leticia Winkler

Algoritmos e Estruturas de Dados II IEC013

Lista: conceito, representação e algoritmos

Lista: conceito, representação e algoritmos

Algoritmos e Estruturas de Dados I

Lista Encadeada (Linked List)

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 9

Professora Jeane Melo

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Estruturas de Dados Estruturas de Dados Fundamentais

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Estrutura de Dados II

Aula 10 Alocação Dinâmica de Memória Listas Encadeadas. prof Leticia Winkler

- Mapa de memória de um processo - Ponteiros

ESTRUTURA DE DADOS FILAS DINÂMICAS

ESTRUTURA DE DADOS VARIÁVEIS E PONTEIROS

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

LINGUAGEM C: ALOCAÇÃO DINÂMICA

PRIMEIRA AVALIAÇÃO IDENTIFICAÇÃO. Nome: 22/09/2010

Prof. Walteno Martins Parreira Júnior

SCC Algoritmos e Estruturas de Dados I

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Aula 7 Encadeamento de Memória

Estrutura de Dados. Estrutura de Dados Recursividade. Exemplo: 5! = 5 x 4! 4! = 4 x 3! 3! = 3 X 2! 2! = 2 x 1! 1! = 1 x 0!

Introdução a Programação. Listas Encadeadas

Capítulo 8: Abstrações de dados

Fila. 26 e 31/8/2008 Representação/Implementação: Seqüencial estática Encadeada dinâmica Exercícios/Aplicações

O que é um jogo digital?

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Métodos Computacionais. Listas Encadeadas

S U M Á R I O. Definição de Estrutura de Dados. Vetores. Listas Ligadas. Pilhas. Filas

Aplicações de listas e outras estruturas

Lista de Exercícios 04

Aula 13: Listas encadeadas (estruturas lineares)

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

Alocação Dinâmica e Apontadores. Cláudio E. C. Campelo

Alocação Dinâmica de Memória. Programação II

Princípios de Desenvolvimento de Algoritmos MAC122

Algoritmos e Estrutura de Dados. Aula 05 Estrutura de Dados: Listas (Parte II) Prof. Tiago A. E. Ferreira

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Listas Lineares Ordenadas

Pilha e Fila. Pilha em C. Definir o registro que representará cada elemento da pilha.

Aula 07: Algoritmos de busca e Listas encadeadas

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

C com introdução a OO

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.

1. Listas sequenciais versus listas ligadas. Lista sequencial

Alocação Dinâmica de Memória

Aplicações de listas Outras estruturas

Estrutura de Dados: Aula 3 - Linguagem C

L I C R P * * V O * * A * A F * * * * *

Alocação Dinâmica. Introdução à Computação

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Algoritmos e Estruturas de dados

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

Linguagem C: Listas Encadeadas

ANHANGUERA ESTRUTURA DE DADOS AULA 06 LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS. Prof. Thomás da Costa

BCC202 - Estrutura de Dados I

Ponteiros. Baseado nos slides do Prof. Mauro.

Gerência de Memória. Execução de um Programa (1) Introdução. Introdução

Algoritmos e Estruturas de dados

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

2. Listas 3. Listas ligadas simples 4. Operações dentro das listas 5. Listas Circulares 6. Listas Duplamente Ligadas 7. Pilhas 8.

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Pilhas e Filas. Nádia Félix e Hebert Coelho

1/36 LISTAS. Programação II

22/08/2011. Fila. SCC0202 Algoritmos e Estruturas de Dados I. Prof. Thiago A. S. Pardo. Fila. O que é? Para que serve?

Alocação Dinâmica de Memória

10.1. Aula 10: Pilhas. O conceito de pilha. Algoritmos de inserção e remoção. Exemplo: Notação Polonesa

Notas da Aula 7 - Fundamentos de Sistemas Operacionais

Lista com descritor (continuação)

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Estrutura de Dados. Aula 07 Alocação Dinâmica

MC-102 Aula 19 Ponteiros II

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

Universidade de São Paulo

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Quarta Lista de Exercícios Implementação e uso de Listas Encadeadas

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

Disciplina que estuda as técnicas computacionais para a organização e manipulação eficiente de quaisquer quantidades de informação.

Ponteiro e lista dinâmica

UNIVERSIDADE DO ESTADO DO RIO DE JANEIRO ANÁLISE DE ALGORITMOS. LISTA DE EXERCÍCIOS (Parte B)

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas. SCC-502 Algoritmos e Estruturas de Dados I

Modulo 12: alocação dinâmica de memória

Lista de Linguagens de Programação 14

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Transcrição:

Estruturas de Dados I Rodrigo Porfírio da Silva Sacchi rodrigosacchi@ufgd.edu.br 3410-2075 Aula 6: Listas Encadeadas e Alocação Dinâmica

Listas Encadeadas e Alocação Dinâmica

Alocação Seqüencial versus Alocação Dinâmica Seqüencial ou Estática: Operações em listas implementadas com alocação seqüencial são muito fracas; Na utilização de mais de duas listas, a gerência de memória é mais complexa usar alocação dinâmica (ou alocação encadeada); Na alocação encadeada, as posições de memória são alocadas (ou desalocadas) na medida em que são necessárias (ou dispensadas).

Alocação Seqüencial versus Alocação Dinâmica Seqüencial ou Estática: Todo espaço de memória a ser utilizado (para armazenar os elementos) é reservado (alocado) em tempo de compilação; Esse espaço de memória permanece alocado durante toda execução do programa, independente de estar efetivamente sendo usado ou não.

Alocação Seqüencial versus Alocação Dinâmica Encadeada ou Dinâmica: O espaço de memória a ser utilizado (para armazenar os elementos) pode ser alocado em tempo de execução, quando for efetivamente necessário (é possível alocar espaço para um elemento de cada vez); O espaço alocado pode ser liberado em tempo de execução, quando não for mais necessário.

Alocação Seqüencial versus Alocação Dinâmica Vantagens e Desvantagens: A alocação encadeada é mais conveniente quando o problema inclui o tratamento de mais de uma lista; O acesso ao k-ésimo elemento da lista é imediato na alocação seqüencial, mas na alocação encadeada obriga ao percurso na lista até o elemento desejado.

Alocação Seqüencial versus Alocação Dinâmica Seqüencial ou Estática: 5 C B A 4 3 2 1 Topo

Alocação Seqüencial versus Alocação Dinâmica Encadeada ou Dinâmica: B 5 Depois de Depois de mim vem o... A 4 3 mim vem o... C 2 Topo 1

Listas Encadeadas Uma lista encadeada L, com n blocos de memória B 1, B 2,... B n é definida pelas seguintes características: Cada bloco de memória B i, 0 <= i < n, ou cada nó da lista tem pelo menos dois campos: Informação a ser armazenada; Indicação do próximo elemento na lista. Os blocos não estão necessariamente em seqüência na lista.

Listas Encadeadas Continuação (...) O acesso aos elementos da lista ocorre através de um ponteiro do início da lista (primeiro elemento); O acesso aos demais elementos ocorre através da indicação de quem é o próximo elemento na seqüência; O último nó da lista indica um endereço inválido, chamado NIL ou NULL.

Listas Encadeadas Representação: Ptr (ponteiro para início da lista L) A B C D B 1 B 2 B 3 B n Fim da lista NULL Se Ptr apontar para NULL (fim da lista), significa que a lista está vazia.

Listas Encadeadas Nas listas encadeadas os nós não estão, obrigatoriamente, em posições contíguas da memória; As operações de inserção ou remoção de elementos requerem encontrar novas posições de memória para armazenamento e liberar outras que possam ser reutilizadas posteriormente; É preciso, portanto, gerenciar a memória disponível;

Listas Encadeadas Linguagens de alto nível possuem um módulo de gerência de memória disponível ao usuário. Basta fazer referência às rotinas internas de ocupação e devolução de nós da lista de espaço disponível; Em C/C++, as rotinas new() e delete() executam essa tarefa. Outras: malloc(), free(); Em Java, a única rotina para acomodar a tarefa de alocação de memória é: new().

Listas Encadeadas Nos algoritmos, usamos uma notação especial: A indicação do endereço de um nó, feita por um ponteiro, será representada pelo símbolo. Cada ponteiro utilizado é associado a um único tipo de nó; Assim, pt info representa o campo info do nó apontado por pt; pt prox representa o endereço do campo prox apontado por pt.

Listas Encadeadas Considere uma lista L. ptr Chave Nó Registro Próximo Como declarar um nó: declare No registro (chave: inteiro, prox: ponteiro de No); declare ptr: ponteiro No;

Listas Encadeadas Tipo de listas: Listas simplesmente encadeadas; Listas circulares; Listas duplamente encadeadas. Estruturas de dados que podemos utilizar: Listas; Pilhas; Filas.

Listas Simplesmente Encadeadas Qualquer estrutura, inclusive listas, que seja armazenada em alocação encadeada requer o uso de um ponteiro que indique o endereço de seu primeiro nó; O percurso de uma lista é feito a partir desse ponteiro. A idéia consiste em seguir, consecutivamente, pelos endereços existentes no campo que indica o próximo nó (semelhante ao índice da alocação seqüencial).

Listas Simplesmente Encadeadas Qualquer estrutura que usa alocação encadeada requer o uso de um ponteiro que indique o endereço de seu primeiro nó (elemento); O percurso em uma lista é feito a partir desse ponteiro;

Listas Simplesmente Encadeadas A idéia consiste em seguir pelos endereços existentes no campo que indica o próximo nó (semelhante ao índice da alocação seqüencial); Exemplo: percorrer uma lista para imprimir o campo chave.

Listas Simplesmente Encadeadas Ptr 3 9 1 5

Listas Simplesmente Encadeadas Algoritmo para imprimir os valores dos campos chave de todos os elementos na lista: procedimento Imprimir(ptr: ponteiro No) início declare pont ptr: ponteiro No; enquanto pont!= null faça escreva pont chave; pont pont prox; fim_enquanto fim

Listas Simplesmente Encadeadas Busca: Buscar em lista ordenada e em lista não ordenada; Se a lista possui elementos, percorrer a lista até que o elemento seja encontrado. Caso contrário, ou a lista está vazia, ou já percorremos toda e o elemento não foi encontrado; Deve ser eficiente.

Listas Simplesmente Encadeadas O ponteiro pont retorna com valor nulo caso o elemento são seja encontrado, caso contrário, retorna com um valor do endereço do elemento na memória. Ptr 3 9 1 5

Listas Simplesmente Encadeadas Algoritmo de busca em listas encadeadas: função ponteiro No Busca(ptr: ponteiro No, x: inteiro) início declare pont: ponteiro No; pont ptr; enquanto( pont!= null e pont chave!= x ) faça pont pont prox; fim_enquanto se( pont!= null ) então retorne pont; fim_se retorne null; fim

Listas Simplesmente Encadeadas Inserção: Após a realização da busca, a operação de inserção em uma lista encadeada é trivial; Três operações devem ser cumpridas: Alocação de memória para o novo elemento (nó); Utilização do nó; Acerto da lista.

Listas Simplesmente Encadeadas Algoritmo de inserção: Inserção no início; Inserção no fim; Inserção em uma lista ordenada.

Listas Simplesmente Encadeadas Inserção no início: procedimento InsereInicio(ptr: ponteiro No, int novo) início declare pont Busca(ptr, novo): ponteiro No; se( pont!= null) então escreva Elemento já existe. ; senão Alocar( pont ); pont chave novo; pont prox ptr; ptr pont; fim_se fim

Listas Simplesmente Encadeadas Queremos inserir o elemento novo = 8. Ptr 3 9 1 5

Listas Simplesmente Encadeadas Remoção: Como ocorre na inserção, após a realização da busca, a operação de remoção em uma lista encadeada é trivial; Três fases devem ser cumpridas: Utilização do nó (se for o caso); Acerto da lista; Desalocação de memória.

Listas Simplesmente Encadeadas Algoritmo de Remoção: Remoção no início; Remoção no fim; Remoção de qualquer elemento; Remoção em uma lista ordenada.

Listas Simplesmente Encadeadas Remoção no início: procedimento RemoveInicio(ptr: ponteiro No) início declare pont ptr; se( ptr!= null ) então ptr ptr prox; Desalocar( pont ); fim_se fim

Listas Simplesmente Encadeadas Queremos remover o elemento = 3. Ptr 8 3 9 1 5

Listas Circulares A busca em uma lista ordenada, vista anteriormente, pode ser considerada pouco eficiente quando comparada às outras buscas anteriormente mencionadas. Uma pequena modificação na estrutura física da lista pode ser de grande auxílio: Obrigar o último nó da lista a apontar para o nócabeça, criando uma lista circular encadeada.

Listas Circulares A B C D B 1 B 2 B 3 B n O último sempre deve apontar para o primeiro.

Listas Circulares Problema: o teste de fim de lista nunca é satisfeito; Solução: colocar a chave procurada no nó cabeça, de forma que uma resposta positiva seja sempre encontrada. Como ficam a busca, inserção e remoção? A busca é semelhante à lista simplesmente encadeada: o ponteiro pont tem o valor de null se o elemento não é encontrado.

Listas Duplamente Encadeadas A lista duplamente encadeada incorpora um novo campo de ponteiro; Os campos de ponteiros tomam os nomes de prev e prox (nó anterior e nó seguinte, respectivamente); Como fica a inicialização do nó cabeça? Os algoritmos de busca, inserção e remoção em tabelas ordenadas são muito simples; Na busca, a função retorna indicando o nó procurado ou, se este não foi encontrado, o nó que seria seu consecutivo.

Listas Duplamente Encadeadas A B C D B 1 B 2 B 3 B n

Listas Duplamente Encadeadas Busca em uma lista duplamente encadeada: função ponteiro No Busca(ptr: ponteiro No, x inteiro) início declare aux: ponteiro No; aux = ptr; enquanto( aux && aux chave!= x) faça aux = aux prox; fim_enquanto se ( aux!= null ) então retorne aux; fim_se retorne null; fim

Listas Duplamente Encadeadas Inserção no início da lista: procedimento InsereInicio(ptr: ponteiro No, x: inteiro) início declare novo: ponteiro No; Aloca(novo, x); se ( novo!= null ) então se( ptr == null ) então ptr = novo; senão novo prox = ptr; ptr prev = novo; ptr = novo; fim_se numelementos numelementos + 1;; fim_se fim

Listas Duplamente Encadeadas Remoção no início da lista: procedimento removeinicio(ptr: ponteiro No) Início declare aux: ponteiro No; se( ptr!= null ) aux = ptr; ptr = ptr prox; ptr prev = 0; Desaloca( aux ); numelementos numelementos 1; fim_se fim

Listas Duplamente Encadeadas Idéias de implementação: Para qualquer lista, seja ela simplesmente ou duplamente encadeada, podemos implementá-la sendo circular ou não; Além disso, podemos também implementar qualquer lista usando dois ponteiros; Além de um ponteiro que sempre aponta para o início da lista, podemos também controlar um ponteiro que sempre aponta para o final da lista; Isto é interessante tanto em listas simplesmente encadeadas quanto em listas duplamente encadeadas. Por que?