Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Slides:



Advertisements
Apresentações semelhantes
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Advertisements

Marco Antonio Montebello Júnior
Listas Lineares Estrutura que permite representar um conjunto de dados de forma a preservar a relação de ordem linear. Uma lista linear é composta de nós,
Listas encadeadas Prof. Rosana Palazon.
Algoritmos de manipulação de estruturas elementares de dados
Programação II Estruturas de Dados
TADS – Tipos Abstratos de Dados
Alocação Dinâmida de Memória
Algoritmos e Estrutura de Dados I
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Alocação Dinâmica de Memória
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Aula T12 – BCC202 Listas Túlio Toffolo
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Listas com Ponteiros Listas encadeadas Listas circulares.
Universidade de Brasília
Slides: Prof. João Fabro UTFPR - Curitiba
Escola Secundária c/ 3º CEB da Batalha
Listas Encadeadas.
Alocação Dinâmica de Memória
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Algoritmos e Estruturas de Dados
Listas Simplesmente Encadeadas
ALGORITMOS E ESTRUTURAS DE DADOS
Prof. Hilton Cardoso Marins Junior LISTA LINEAR
Alocação Dinâmica de Memória Professor Mário Dantas
Listas Encadeadas Raquel O. Prates, Luiz Chaimowicz, Jussara Almeida
Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal:  var.
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 8 Ponteiros Monitoria de Introdução à Programação
Aula prática 13 Orientação a Objetos – C++ Parte 1
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Linguagem de Programação II Parte IX
Sistemas Operacionais
Definição de Tipos Estruturas e Ponteiros
INTELIGÊNCIA ARTIFICIAL
Alocação Dinâmica de Memória
Implementação de FILAS com Alocação Dinâmica
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Alocação Dinâmica de Memória
Professor Mário Dantas
Prof. Ricardo Santos PONTEIROS
Linguagem C : Ponteiros
Estruturas de Dados Aula 9: Listas (parte 1)
Aula 13 - Armazenamento de Dados em Arquivos
Estruturas de Dados Aula 11: TAD Pilha
SISTEMAS OPERACIONAIS I
Sistemas Operacionais
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Listas.
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
Estruturas de Dados Aula 17: Estruturas Genéricas
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Algoritmos e Estruturas de Dados
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Estruturas de Dados Dinâmicas IF672 - Algoritmos e Estruturas de Dados.
Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa.
Ponteiros em C Prof. Kariston Pereira
Estrutura de Dados Aula 3 - Listas
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
COMPILADORES 07 Prof. Marcos.
ponteiros Estrutura de Dados Prof. André Cypriano M. Costa
Lista Ligada Estrutura de Dados II Prof. Gale. Vantagens  Crescem (ou decrescem) à medida que elementos são inseridos (ou removidos)  seqüência encadeada.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Alocação Dinâmica de Memória e Tipo Abstrato de Dados Cristiano Arbex Valle Vinicius Fernandes dos Santos
Transcrição da apresentação:

Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Listas Encadeadas Uma lista encadeada é uma representação de uma sequência de objetos na memória do computador. Cada elemento da sequência é armazenado em uma célula da lista: o primeiro elemento na primeira célula, o segundo na segunda e assim por diante.

Lista: Operações Adicionar um elemento na primeira posição de um Vetor consome muito tempo, Pois temos de deslocar todos os outros elementos uma posição para a frente. A performance dessa operação degrada a medida que a quantidade de elementos do nosso vetor cresce: ela consome tempo linear em relação ao número de elementos.

Lista: Operações Analogamente, remover um elemento da primeira posição implica em deslocar todos os outros elementos que estão na sua frente para trás. Em alguns casos, queremos uma implementação de Lista na qual a operação de adicionar ou a de remover um aluno na primeira posição seja computacionalmente eficiente. Conseguiremos isso através de uma Lista Ligada.

Lista: Operações Operações que poderemos fazer em uma dada lista Adicionar um dado elemento no fim da Lista. Adicionar um dado elemento em um dada posição. Pegar o elemento de uma dada posição. Remover o elemento de uma dada posição. Verificar se um dado elemento está contido na Lista. Informar a quantidade de elementos da Lista.

Listas encadeadas Precisamos de algo que não seja fixo como um array. Então a idéia aqui é ter uma forma de, dado um aluno, saber quem é o próximo, sem usar uma estrutura fixa

Listas encadeadas Repare que: apesar do efeito de um aluno estar “ao lado” do outro, na memória é mais provável que eles não se encontrem um ao lado do outro, e sim em regiões bem diferentes da memória, só que cada um deles sabe dizer em que local se encontra o próximo aluno (pois temos a referência ao proximo).

Célula e Lista Ligada

Listas Encadeadas

Estrutura de uma lista encadeada Uma lista encadeada  (= linked list = lista ligada)  é uma sequência de células; cada célula contém: um objeto de algum tipo e o endereço da célula seguinte.   Vamos supor que os objetos armazenados nas células são do tipo int.  A estrutura de cada célula de uma tal lista pode ser definida assim: struct cel { int conteudo; struct cel *prox; };

Estrutura de uma lista encadeada É conveniente tratar as células como um novo tipo-de-dado e atribuir um nome a esse novo tipo: typedef struct cel celula; Uma célula  c  e um ponteiro  p  para uma célula podem ser declarados assim: celula c; celula *p;

Estrutura de uma lista encadeada Se c é uma célula então  c.conteudo  é o conteúdo da célula e  c.prox  é o endereço da próxima célula.  Se  p  é o endereço de uma célula, então:   p->conteudo  é o conteúdo da célula e   p->prox  é o endereço da próxima célula.  Se  p  é o endereço da última célula da lista então   p->prox  vale NULL.

Endereço de uma lista encadeada O endereço de uma lista encadeada é o endereço de sua primeira célula.  Se p é o endereço de uma lista, convém, às vezes, dizer simplesmente "p é uma lista". Listas são entidades eminentemente recursivos. Para tornar isso evidente, basta fazer a seguinte observação:  se p é uma lista então vale uma das seguintes alternativas: p == NULL  ou p->prox  é uma lista.

Listas com cabeça e sem cabeça Uma lista encadeada pode ser organizada de duas maneiras diferentes, um óbvia e outra menos óbvia. Lista com cabeça O conteúdo da primeira célula é irrelevante: ela serve apenas para marcar o início da lista.  A primeira célula é a cabeça (= head cell = dummy cell) da lista.  A primeira célula está sempre no mesmo lugar na memória, mesmo que a lista fique vazia. 

Lista com cabeça Digamos que ini é o endereço da primeira célula. Então  ini->prox == NULL  se e somente se a lista está vazia. Para criar uma lista vazia, basta dizer

Lista sem cabeça Lista sem cabeça O conteúdo da primeira célula é tão relevante quanto o das demais. Nesse caso, a lista está vazia se o endereço de sua primeira célula é NULL.  Para criar uma lista vazia basta fazer

Alocação estática de memória As declarações abaixo alocam memória para diversas variáveis. A alocação é estática, pois acontece antes que o programa comece a ser executado: char c; int i; int v[10];

Alocação dinâmica de memória Às vezes, a quantidade de memória a alocar só se torna conhecida durante a execução do programa. Para lidar com essa situação é preciso recorrer à alocação dinâmica de memória. A alocação dinâmica é gerenciada pelas funções: malloc  Free que estão na biblioteca stdlib.  Para usar esta biblioteca, é preciso dizer #include <stdlib.h> no início do programa.

Função malloc A função malloc (abreviatura de memory allocation) aloca um bloco de bytes consecutivos na memória do computador e devolve o endereço desse bloco.  O número de bytes é especificado no argumento da função. No seguinte fragmento de código, malloc aloca 1 byte: O endereço devolvido por malloc é do tipo "genérico"  void *.   O programador armazena esse endereço num ponteiro de tipo apropriado. No exemplo ao lado, o endereço é armazenado num ponteiro-para-char.

Função malloc O que fazer para alocar um tipo-de-dado que ocupa vários bytes? É preciso recorrer ao operador sizeof, que diz quantos bytes o tipo especificado tem:

Atenção Overhead. Cada invocação de malloc aloca um bloco de bytes consecutivos maior que o solicitado: os bytes adicionais são usados para guardar informações administrativas sobre o bloco de bytes essas informações permitem que o bloco seja corretamente desalocado, mais tarde, pela função free.  O número de bytes adicionais pode ser grande, mas não depende do número de bytes solicitado no argumento de malloc.  Não é recomendável, portanto, invocar malloc repetidas vezes com argumento muito pequeno.  É preferível alocar um grande bloco de bytes e retirar pequenas porções desse bloco na medida do necessário.

A memória é finita Se a memória do computador já estiver toda ocupada? malloc não consegue alocar mais espaço e devolve NULL. Convém verificar essa possibilidade antes de prosseguir:

Função Free As variáveis alocadas estaticamente dentro de uma função desaparecem quando a execução da função termina. Já as variáveis alocadas dinamicamente continuam a existir mesmo depois que a execução da função termina. Se for necessário liberar a memória ocupada por essas variáveis, é preciso recorrer à função free.

Função Free A função free libera a porção de memória alocada por malloc. O comando free( ptr) avisa o sistema de que o bloco de bytes apontado por ptr está livre. A próxima chamada de malloc poderá tomar posse desses bytes. A função free não deve ser aplicada a uma parte de um bloco de bytes alocado por malloc; aplique free apenas ao bloco todo.

Função Free Convém não deixar ponteiros "soltos" (= dangling pointers) no seu programa pois isso pode ser explorado por hackers para atacar o seu computador. Portanto, depois de cada free( ptr), atribua NULL a ptr:

Para saber mais Ler e entender os algoritmos descrito em: http://www.inf.ufsc.br/~ine5384-hp/Capitulo4/EstruturasListaEncadeada.html

Bibliografia http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html https://www.caelum.com.br%2Fapostila-java-estrutura-dados%2Flistas-ligadas