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 – Conceitos Avançados Estruturas de Dados e Algoritmos.

Apresentações semelhantes


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

1 1/3/2014Fábio Lopes Caversan 1 Listas Ligadas – Conceitos Avançados Estruturas de Dados e Algoritmos

2 Fábio Lopes Caversan 2 1/3/2014 Listas Circulares Dado um ponteiro p para um nó numa lista linear Não é possível atingir nenhum dos nós que antecedem o Node p Ao atravessar uma lista, o ponteiro externo deve ser preservado para não perdemos a lista Numa lista circular o campo Next do último nó, ao invés de ponteiro nulo, contém um ponteiro para o primeiro nó

3 Fábio Lopes Caversan 3 1/3/2014 Primeiro nó Último nó list Atingi-se qualquer ponto da lista, não importando o ponto de partida Não existe mais um primeiro e último nó natural Uma convenção é considerar o último nó como apontado pelo ponteiro externo (list). E o nó seguinte torna-se o primeiro nó Último nó: list Primeiro nó: list.Next Permite incluir/remover elemento a partir do início ou do final de uma lista Por convenção: ponteiro nulo representa uma lista circular vazia

4 Fábio Lopes Caversan 4 1/3/2014 Pilha como lista circular Seja stack um ponteiro para o último nó de uma lista circular O primeiro nó é o topo da pilha A função Empty pode ser: Empty () { return (stack == NULL); }

5 Fábio Lopes Caversan 5 1/3/2014 Chamando Push(x) public void Push (object x) { Node p; p = new Node ( ); p.Info = x; if (Empty ()) stack = p; else p.Next = stack.Next; stack.Next = p; } Push é mais complexa para lista circulares do que para listas lineares

6 Fábio Lopes Caversan 6 1/3/2014 Chamando Pop () public object Pop () { object x; Node p; if (Empty ()) throw new Exception (Underflow da pilha); p = stack.Next; x = p.Info; if ( p == stack) stack = NULL; /* só havia um nó na pilha */ else stack.Next = p.Next; p = NULL; return x; }

7 Fábio Lopes Caversan 7 1/3/2014 Agora é vez das filas... É mais fácil representar uma fila como lista circular do que lista linear É usado apenas um único ponteiro p p é o final da fila e nó seguinte é seu início A função Empty() é idêntica à da pilha Remove () é idêntica à pop, basta substituir stack por queue que é um ponteiro para a fila

8 Fábio Lopes Caversan 8 1/3/2014 Chamando Insert(x) Insert (int x) { Node p; p = new Node( ); p.Info = x; if (Empty()) queue = p; else p.Next = queue.Next; queue.Next = p; queue = p; return; } Insert (x) equivale a: Push (x); queue = queue.Next; Isso significa que para inserir um elemento no final de uma fila circular, o elemento é inserido no início da fila e o ponteiro da lista circular avança um elemento para que o novo elemento ocupe o final.

9 Fábio Lopes Caversan 9 1/3/2014 Operações primitivas para listas circulares InsertAfter(x) é semelhante à rotina das listas lineares public object DeleteAfter (Node p) { object x; Node q; if (( p == NULL || (p == p.Next)) throw new Exception(Não há próximo nó para remover); q = p.Next; x = q.Info; p.Next = q.Next; q = NULL; return x; }

10 Fábio Lopes Caversan 10 1/3/2014 O problema de Josephus Solução com lista circular Solução com lista circular Um grupo de soldados circundado por uma força inimiga esmagadora Um grupo de soldados circundado por uma força inimiga esmagadora Não há esperanças de vitória Não há esperanças de vitória O negócio é escapar... O negócio é escapar... Mas só existe um cavalo disponível!!!! Mas só existe um cavalo disponível!!!! Que tal um acordo para escolher o soldado felizardo ?

11 Fábio Lopes Caversan 11 1/3/2014 É sorteado um número n de um chapéu e também o nome de um soldado É sorteado um número n de um chapéu e também o nome de um soldado Iniciando no soldado, eles começam a contar no sentido horário Iniciando no soldado, eles começam a contar no sentido horário O soldado no qual a contagem n é finalizado, é retirado do círculo O soldado no qual a contagem n é finalizado, é retirado do círculo A contagem reinicia no soldado seguinte ao retirado do círculo A contagem reinicia no soldado seguinte ao retirado do círculo Todo soldado que sair do círculo, não entra mais no processo Todo soldado que sair do círculo, não entra mais no processo O último soldado é o felizardo para escapar com o cavalo O último soldado é o felizardo para escapar com o cavalo

12 Fábio Lopes Caversan 12 1/3/2014 Listas duplamente ligadas Uma lista circular tem vantagens sobre uma lista linear Mas apresenta várias deficiências: não dá para percorrê-la no sentido contrário, nem um nó pode ser ser eliminado, em função de apenas um ponteiro para esse nó Para sobrepujar a deficiências acima, o mais adequado é utilizar a lista duplamente ligada

13 Fábio Lopes Caversan 13 1/3/2014 nulo Lista linear duplamente ligada Lista circular duplamente ligada sem cabeçalho

14 Fábio Lopes Caversan 14 1/3/2014 Observações Cada nó tem dois ponteiros: um para seu predecessor e outro para seu sucessor De fato os termos predecessor e sucessor não fazem sentido, porque a listas duplamente ligadas são simétricas As listas duplamente ligadas podem ser lineares ou circulares e, podem conter ou não nó de cabeçalho Um nós tem três campos: Info, Prior e Next que contem ponteiros para os nós em ambos os lados

15 Fábio Lopes Caversan 15 1/3/2014 Inserindo um novo primeiro elemento numa lista duplamente ligada novo Info info null Info null novo null Info null Info

16 Fábio Lopes Caversan 16 1/3/2014 Inserindo um novo elemento no meio de uma lista duplamente ligada novo Info info null Info null novo Info info null Info null

17 Fábio Lopes Caversan 17 1/3/2014 Inserindo um novo último elemento numa lista duplamente ligada novo Info info null Info null novo null Info info Info null

18 Fábio Lopes Caversan 18 1/3/2014 Apagando o primeiro elemento Info null Info Info null Info null Info null Excluído null null

19 Fábio Lopes Caversan 19 1/3/2014 Apagando o elemento do meio Info null Info Info null Info null Excluído null null Info null

20 Fábio Lopes Caversan 20 1/3/2014 Apagando o último elemento Info null Info Info null Excluído null null Infp null Info null

21 Fábio Lopes Caversan 21 1/3/2014 Representando o nó public class Node { object info; Node prior, next;... // Gets e Sets };

22 Fábio Lopes Caversan 22 1/3/2014 Eliminação de um nó em listas duplamente ligadas public object Delete (Node p) { object x; Node q,r; if (p == NULL) throw new Exception(Renovação vazia); x = p.Info; q = p.Prior; r = p.Next; q.Next = r; r.Prior = q; p = NULL; return; }

23 Fábio Lopes Caversan 23 1/3/2014 Inserindo um nó com informação x à direita de p InsertAfter (Node p, int x) { Node q,r; if (p == NULL) throw new Exception(Inserção vazia); q = new Node ( ); q.Info = x; r = p.Next; r.Prior = q; q.Next = r; q.Left = p; p.Next = q; return; }


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

Apresentações semelhantes


Anúncios Google