LISTAS DUPLAMENTE ENCADEADAS

Slides:



Advertisements
Apresentações semelhantes
RECORTE DE FIGURAS Algoritmo proposto para Recorte de Segmentos (atribuído a Ivan Sutherland e Dan Cohen) Para o entendimento do algoritmo a ser proposto,
Advertisements

LISTAS Dilvan Moreira, parcialmente baseado em material do prof. Ricardo Campello.
Aula T10 – BCC202 Listas – Parte 2 Túlio Toffolo www. decom. ufop
Listas encadeadas Prof. Rosana Palazon.
Listas duplamente encadeadas
Algoritmos BUSCA E INSERÇÃO
ESTRUTURAS DO TIPO FILA
Universidade Federal do Pará Serviço Público Federal Centro de Ciências Exatas e Naturais Departamento de Informática Abril/2001.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Estruturas de Dados I DECOM – UFOP
Filas David Menotti Estruturas de Dados I DECOM – UFOP.
Aula T11 – BCC202 Pilhas Túlio Toffolo
Pilha David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Aula T12 – BCC202 Listas Túlio Toffolo
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Listas com Ponteiros Listas encadeadas Listas circulares.
Slides: Prof. João Fabro UTFPR - Curitiba
Robson Godoi / Sandra Siebra
Lista Encadeada Circular Lista Duplamente Encadeada
Robson Godoi / Sandra Siebra
Listas Encadeadas.
Algoritmos e Estruturas de Dados
Listas Simplesmente Encadeadas
ALGORITMOS E ESTRUTURAS DE DADOS
Prof. Hilton Cardoso Marins Junior LISTA LINEAR
© 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice.
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.
Variáveis, Tipos de Dados e Constantes
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 02a Roberto Ferrari Mauricio Falvo.
Pesquisa em Memória Primária
Denise Guliato Faculdade de Computação – UFU
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 02b Roberto Ferrari Mauricio Falvo.
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 04b Roberto Ferrari Mauricio Falvo.
Listas duplamente encadeadas Estrutura: tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Ant: tPtNo Dado: tDado; Prox: tPtNo; end; var.
Procedure PercPreOrdem(a: tPtNo); var q: tPtNo; P: tPilha; begin Inicializa(P); Empilhar(P,a); while not PilhaVazia(P) do begin q:= Topo(P); Desempilhar(P);
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.
Árvores Binárias de Pesquisa
Implementação de FILAS com Alocação Dinâmica
Lista Encadeada Circular Lista Duplamente Encadeada
Listas lineares Denise Guliato Faculdade de Computação – UFU
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 03a
Listas, Filas e Pilhas Katia Guimarães.
Aula 3 Listas, pilhas, filas.
Estruturas de Dados Aula 9: Listas (parte 1)
Ambiente de Execução - Rotinas
Lista encadeada Representar um grupo de dados.
Capítulo III Modularização Procedimentos e Funções Universidade Federal de São Carlos Departamento de Computação Aluna: Luanna Lopes Lobato
Estruturas de Dados Aula 11: TAD Pilha
Árvore Binária de Busca
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 04 – 22/03 Listas Duplamente Encadeada – Listas Encadeada Circular – Lista Duplamente Encadeada Circular.
Estruturas de Dados Aula 17: Estruturas Genéricas
ESTRUTURA DE DADOS Aula 10 – Listas Duplamente Encadeadas.
Vetores Bidimensionais – Debug - Ponteiros – Listas Encadeadas Simples
Aula 06 – 05/04 Árvores binárias.
Prof. Hilton Cardoso Marins Junior
Professor Ulisses Vasconcelos
Métodos de Ordenação.
Prof Ulisses Vasconcelos ESTRUTURA DE DADOS AULA 02 - PILHA Conceito Inserção Remoção.
Estruturas de Dados Aula 9 -2: Listas simplesmente encadeadas sem sentinela e sem cabeçalho 19/06/2013.
Estruturas de Dados Aula 10: Listas (parte 2) 07/05/2014.
Profa. Juliana Mafra ESTRUTURA DE DADOS 30 de Setembro de 2009 Faculdade de Informática e Tecnologia de Pernambuco.
Listas Duplamente Encadeadas Profs Prog2 e Lab2 Unisinos.
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.
UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle Vinicius Fernandes dos Santos
Transcrição da apresentação:

LISTAS DUPLAMENTE ENCADEADAS

Listas Encadeadas: Características Listas encadeadas são percorridas do início ao final. E se for necessário percorrer uma lista nas duas direções indiferentemente? Ex.: Ponteiro para o “nó anterior" necessário para muitas operações (busca, inserção, ...) Utilização de um ponteiro extra em cada nó, que indica o ponteiro anterior ao nó O gasto de memória imposto por um novo campo de ponteiro é justificado pela facilidade no processa-mento de toda lista

Implementação de Listas com Ponteiros Os nós (itens) da lista são registros com dois ponteiros, para guardar o endereço do seu sucessor e antecessor Antecessor (esq) ... x1 x1 x2 x3 xn Sucessor (dir)

Implementação da Lista Duplamente Encadeada type Ponteiro = ^TipoNo; TipoItem = record chave: TipoChave;     {outros componentes desejadas...}      end; TipoNo = record Item: TipoItem;     Ant, Prox: Ponteiro;      end; TipoListaDupla = record               Primeiro: Ponteiro; Último : Ponteiro;             end; var L: TipoListaDupla;

Implementação: Inicia_Lista e Lista_Vazia procedure Inicia_Lista (var LD: TipoListaDupla); begin New (LD.Primeiro); LD.Último := LD.Primeiro; LD.Primeiro^.Prox := nil;{LD.Último^.Prox := nil} LD.Primeiro^.Ant := nil;{LD.Último^.Ant := nil} end; function Lista_Vazia (var LD: TipoListaDupla): boolean; Lista_Vazia := LD.Último = LD.Primeiro;

Implementação: Imprime_Lista procedure Imprime_Lista(var LD: TipoLista); var Aux: Ponteiro; begin Aux:= LD.Primeiro^.Prox; while (Aux <> nil) do writeln (‘Chave: ‘, Aux^.Item.Chave); Aux := Aux^.Dir; end;

Implementação: Imprime_Lista procedure Imprime_Lista(var LD: TipoLista); var Aux: Ponteiro; begin Aux:= LD.Ultimo; while (Aux <> LD.Primeiro) do writeln (‘Chave: ‘, Aux^.Item.Chave); Aux := Aux^.Esq; end;

Inserção de um Nó Duas situações: Inserção à Direita de um nó e Inserção à Esquerda de um Nó Caso 1: Inserção à Direita Procedimento recebe o nó à esquerda do qual se deseja inserir (o item vai ser inserido à direita desse nó passado como parâmetro) Cria-se um novo nó Ponteiro à direita do novo nó recebe o ponteiro à direita do nó passado como parâmetro Ponteiro à esquerda do novo nó recebe o ponteiro passado como parâmetro Ponteiro à direita do nó passado como parâmetro recebe o novo nó Ponteiro à esquerda do nó à direita do novo nó recebe o novo nó

Inserção do Nó X à direita de P em Lista Duplamente Encadeada Primeiro Último cabeça X

Inserção à direita de p procedure Insere_a_Direita (p:Ponteiro; x:TipoItem; var LD:TipoListaDupla; var flag: boolean); {O nó será inserido à direita do ponteiro p passado como parâmetro} var pNovo: Ponteiro; begin new(pNovo); if pNovo = nil then flag := FALSE else begin pNovo^.Item.chave := x.chave; pNovo^.Prox := p^.Prox; pNovo^.Ant := p; p^.Prox := pNovo; if pNovo^.prox = nil then LD.Ultimo := pNovo else pNovo^.Prox^.Esq := pNovo; flag := TRUE; end end; {Caso em que p aponta para o último elemento, então o novo elemento será o último da lista}

Inserção de um Nó Caso 2: Inserção à Esquerda Procedimento recebe o nó à direita do qual se deseja inserir (o item vai ser inserido à esquerda desse nó passado como parâmetro) Cria-se um novo nó Ponteiro à esquerda do novo nó recebe o ponteiro à esquerda do nó passado como parâmetro Ponteiro à direita do novo nó recebe o ponteiro passado como parâmetro Ponteiro à esquerda do nó passado como parâmetro recebe o novo nó Ponteiro à direita do nó à esquerda do novo nó recebe o novo nó

Inserção do Nó X à esquerda de P em Lista Duplamente Encadeada Primeiro Último cabeça X

Inserção à esquerda de p procedure Insere_a_Esquerda (p:Ponteiro; x:TipoItem; var LD:TipoLista; var flag: boolean); { A inserção é feita à esquerda do ponteiro p } var pNovo: Ponteiro; begin new(pNovo); if pNovo = nil or p = LD.Primeiro then flag := FALSE else begin pNovo^.Item := x; pNovo^.Prox := p; pNovo^.Ant := p^.Ant; p^.Ant := pNovo; pNovo^.Esq^.Dir := pNovo; flag := TRUE; end end;

Remoção de um Nó Também duas situações: Remoção à Direita de um nó e Remoção à Esquerda de um Nó Caso 1: Remoção à Direita Procedimento recebe o nó à esquerda do qual se deseja remover(o item vai ser removido à direita desse nó passado como parâmetro) Cria-se um auxiliar para apontar para o nó à direita Ponteiro à direita do nó passado como parâmetro aponta para a direita do nó auxiliar Ponteiro à esquerda do nó à esquerda do nó auxiliar aponta para o nó à esquerda do nó auxiliar Retorna o ítem que está no nó auxiliar Apaga-se o nó auxiliar

Remoção do Nó X à direita de P em Lista Duplamente Encadeada Primeiro Último cabeça

Remoção à direita de p procedure Remove_a_Direita (p:Ponteiro; x:TipoItem; var LD:TipoListaDupla; var flag: boolean); {O nó será removido à direita do ponteiro p passado como parâmetro} var aux: Ponteiro; begin if Vazia(LD) or LD^.prox=nil then flag := false else begin aux := p^.prox; x := aux^.Item; p^.prox := aux^.Prox; if aux^.prox = nil then LD.Ultimo := p else aux^.Prox^.Ant := aux^.Ant; Dispose (aux); flag := TRUE; end end; {Caso em que aux aponta para o último elemento, então o apontador para última posição será P}

Remoção à Esquerda de um Nó Caso 2: Remoção à Esquerda Procedimento recebe o nó à direita do qual se deseja remover(o item vai ser removido à esquerda desse nó passado como parâmetro) Cria-se um auxiliar para apontar para o nó à esquerda Ponteiro à esquerda do nó passado como parâmetro aponta para a esquerda do nó auxiliar Ponteiro à direita do nó à direita do nó auxiliar aponta para o nó à direita do nó auxiliar Retorna o ítem que está no nó auxiliar Apaga-se o nó auxiliar

Remoção do Nó X à Esquerda de P em Lista Duplamente Encadeada Primeiro Último cabeça

Remoção à direita de p procedure Remove_a_Esquerda (p:Ponteiro; x:TipoItem; var LD:TipoListaDupla; var flag: boolean); {O nó será removido à esquerda do ponteiro p passado como parâmetro} var aux: Ponteiro; begin if Vazia(LD) or p=LD.Primeiro then flag := false else begin aux := p^.ant; x := aux^.Item; p^.ant := aux^.ant; aux^.Ant^.Prox := aux^.Prox; Dispose (aux); flag := TRUE; end end;