A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

1/3/2014Fábio Lopes Caversan 1 Listas Ligadas Estruturas de Dados e Algoritmos.

Apresentações semelhantes


Apresentação em tema: "1/3/2014Fábio Lopes Caversan 1 Listas Ligadas Estruturas de Dados e Algoritmos."— Transcrição da apresentação:

1

2 1/3/2014Fábio Lopes Caversan 1 Listas Ligadas Estruturas de Dados e Algoritmos

3 Fábio Lopes Caversan 2 1/3/2014 Listas Ligadas Desvantagens do armazenamento seqüencial para representar pilhas e filas: Subdimensionamento ou superdimensionamento da memória devido a alocação fixa de uma certa quantidade de memória antes da execução do programa Possibilidade de overflow

4 Fábio Lopes Caversan 3 1/3/2014 Compartilhando a memória disponível Suponha uma implementação seqüencial de pilhas Stack x,y,z; Suponha que sejam inicializadas, de forma estática, com 50 elementos x,y,z terão, durante a utilização, respectivamente, no máximo, 20, 10 e 70 elementos

5 Fábio Lopes Caversan 4 1/3/2014 Fazendo cálculos 100 células seriam necessárias Porém, na inicialização, deve-se usar o tamanho 70 para não ocorrer um overflow Então, temos 3* 70 = 210,quando somente 100 serão utilizadas Que tal evitar esse desperdício através de um gerenciador de memória? Ele controlaria quem recebe mais ou menos células de memória

6 Fábio Lopes Caversan 5 1/3/2014 Agrupando as células livres num banco de memória livre Banco de memóriaVariáveis xyz nadanadanada

7 Fábio Lopes Caversan 6 1/3/2014 OperaçãoBanco de memóriaxy z x.Push(a) (nada) (nada) y.Push(b) (nada) y.Push(c) (nada) x.Push(d) (nada) z.Push(e) (nada)

8 Fábio Lopes Caversan 7 1/3/2014 OperaçãoBanco de memóriaxyz z.Push(f)(nada) y.Pop() z.Pop()(nada) x.Pop() (nada) z.Push(g)

9 Fábio Lopes Caversan 8 1/3/2014 Considerações importantes A ordem das células de memória disponíveis no banco, no decorrer da execução da aplicação, muda substancialmente O importante é manter um controle sobre a ordem lógica das células de memória e não, necessariamente, sobre a ordem física

10 Fábio Lopes Caversan 9 1/3/2014 Lista Ligada (Encadeada) Linear Cada item na lista é um nó Todo nó contem dois campos: o de informação e do endereço seguinte Campo de informação: armazena o real elemento da lista Campo de endereço: endereço do próximo nó na lista. É um ponteiro!

11 Fábio Lopes Caversan 10 1/3/2014 Algumas representações do nó... Endereço do próximo nó Informação nulo

12 Fábio Lopes Caversan 11 1/3/2014 Continuando... A lista ligada inteira é acessada a partir de um ponteiro externo que aponta para o primeiro nó da lista Um ponteiro externo não está incluindo dentro de um nó. É acessado por referência a uma variável O campo do próximo endereço do último nó da lista contém um valor especial: null O ponteiro nulo (null) marca o final da lista Uma lista sem nós é uma lista vazia ou nula Nesse caso, o ponteiro externo para a lista é nulo Uma lista pode ser inicializada por uma operação do tipo list = null (sendo list o ponteiro externo)

13 Fábio Lopes Caversan 12 1/3/2014 Revisando o mapa conceitual de um programa na memória Pilha Heap Variáveis Globais Código do Programa Endereços de retorno de funções, variáveis locais Alocação dinâmica: listas encadeadas

14 Fábio Lopes Caversan 13 1/3/2014 Ao fotografar a memória do computador LIST Ponteiro externo que aponta para o primeiro nó da lista ligada. Cuidado com sua manipulação! Programa Área Livre (Heap)

15 Fábio Lopes Caversan 14 1/3/2014 N1 N n null N2N3... L Dois endereços merecem atenção especial: O endereço L do nó inicial que permite identificar em que parte da memória inicia-se a lista O endereço NULL que vem após o nó final. É onde termina a lista Sempre lembrando, cada nó i é composto de duas partes: Info: área onde é armazenado o i-ésimo elemento da lista Next: área onde é armazenado o endereço do nó N i + 1

16 Fábio Lopes Caversan 15 1/3/2014 Declarando uma classe Nó para uma lista ligada Um dos atributos da classe precisa ser um ponteiro para uma estrutura do mesmo tipo public class Node { private object info; private Node next;... };

17 Fábio Lopes Caversan 16 1/3/2014 Permitindo o acesso aos atributos De acordo com a linguagem, pode ser necessária a escrita de métodos para ler e escrever nos atributos, garantindo o encapsulamento. Nas linguagens que possuem propriedades, isso pode ser feito com os comandos get e set. Cada vez que atribuímos um valor para a propriedade, o set é chamado. Cada vez que lemos um valor da propriedade, o get é chamado.

18 Fábio Lopes Caversan 17 1/3/2014 public class Node { private object info; private Node next; public object Info { get {return info;} set {info = value;} } public Node Next { get {return next;} set {next = value;} }... };

19 Fábio Lopes Caversan 18 1/3/2014 list Incluindo um elemento no início da lista nulo 3 info next info next info next p list list p

20 Fábio Lopes Caversan 19 1/3/ nulo 6 p 35 6 p 35 6 list list list

21 Fábio Lopes Caversan 20 1/3/2014 Os passos anteriores são expressos pelo seguinte algoritmo Node p = new Node(); p.Info = x; p.Next = list; list = p;

22 Fábio Lopes Caversan 21 1/3/2014 Removendo um nó do início de uma lista list nulo info next info next info next 7 9 nulo 5 5 list P list list list X=7 P P P list

23 Fábio Lopes Caversan 22 1/3/2014 Os passos anteriores para remover um nó são expressos pelo seguinte algoritmo Node p = list; list = p.Next; x = p.Info;

24 Fábio Lopes Caversan 23 1/3/2014 Implementação ligada de Pilhas Incluir um elemento no início de uma lista ligada é semelhante à inclusão numa pilha O 1º nó da lista representa o topo da pilha Vantagem: todas as pilhas ou filas usadas por um programa podem compartilhar a mesma lista de nós disponíveis, desde que não ultrapassam a quantidade total de nós disponíveis

25 Fábio Lopes Caversan 24 1/3/2014 Uma pilha usando lista ligada 7 nulo stack stack

26 Fábio Lopes Caversan 25 1/3/2014 Como o 1º nó da lista é o topo da lista A implementação de Push (x) poderia ficar: Node p = new Node( ); p.Info = x; p.Next = stack; stack = p;

27 Fábio Lopes Caversan 26 1/3/2014 A implementação de x = pop (s) poderia ficar : if (Empty ()) // Exception, mensagem, etc... else { Node p = stack; stack = p.Next; x = p.Info; p = null; return x; }

28 Fábio Lopes Caversan 27 1/3/2014 Uma fila usando lista ligada 3 nulo nulo início início final final

29 Fábio Lopes Caversan 28 1/3/2014 Algoritmo para x = q.Remove () if (Empty()) // Exceção, mensagem, etc... Node p = front; x = p.Info; front = p.Next; if (front = = null) rear = null; p = null; return ( x ); A fila q consiste numa fila e dois ponteiros: front e rear. As operações q.Empty() e x=q.Remove() são análogas a s.Empty(s) e x=s.Pop(s), basta substituir front por stack. Muita atenção ao remover o último elemento da fila: rear fica também nulo porque se a fila está vazia front e rear devem ser nulos

30 Fábio Lopes Caversan 29 1/3/2014 Algoritmo para q.Insert (x) Node p = new Node(); p.Info = x; p.Next = null; if (rear = = null ) front = p; else rear.Next = p; rear = p;

31 Fábio Lopes Caversan 30 1/3/2014 Desvantagens de pilhas e filas como listas ligadas? Mais armazenamento do que o vetor: Info e Next Mas o espaço de armazenamento não é o dobro. Depois, pode-se compactar as informações Cada inclusão/exclusão corresponde a uma inclusão/exclusão na lista de nós disponíveis Grande vantagem: compartilhamento de nós, desde que não ultrapasse o número de nós disponíveis

32 Fábio Lopes Caversan 31 1/3/2014 Listas ligadas como estruturas de dados São importantes não só para implementar pilhas e filas, mas como estruturas de dados Acessa-se um item percorrendo-se a lista a partir do início Um vetor permite o acesso direto ao enésimo item com uma única operação Já uma lista exige n operações e é necessário percorrer cada um dos primeiros n-1 elementos antes do enésimo Vantagem da lista: aparece na inserção ou remoção de um elemento porque não é necessário nenhuma movimentação dos n elementos

33 Fábio Lopes Caversan 32 1/3/2014 x0 x1 x2 x3 x4 x5 x0 x1 x2 x x3 x4 x5 x6 x0 x1 x2 x3 x4 x5 Inserção de um novo elemento num vetor

34 Fábio Lopes Caversan 33 1/3/2014 InsertAfter (n,x) Node p = new Node() p.Info = x; p.Next = n.Next; n.Next = p XX4 nuloX0X1X2X3 list n X4 nuloX0X1X2X3 list n Já numa lista o trabalho de inserção independe do seu tamanho DeleteAfter(n) Node p = n.Next; x = p.Info; n.Next = p.Next; p = null;


Carregar ppt "1/3/2014Fábio Lopes Caversan 1 Listas Ligadas Estruturas de Dados e Algoritmos."

Apresentações semelhantes


Anúncios Google