Listas Encadeadas Circulares Listas Duplamente Encadeadas

Slides:



Advertisements
Apresentações semelhantes
IFTO ESTRUTURA DE DADOS AULA 05 Prof. Manoel Campos da Silva Filho
Advertisements

TADs Vector, Lista e Sequência
Motivação para listas duplamente encadeadas e circulares
UNICAMP Universidade Estadual de Campinas Centro Superior de Educação Tecnológica Divisão de Telecomunicações Propagação de Ondas e Antenas Prof.Dr. Leonardo.
INFORMAÇÕES COMPLEMENTARES
Palestras, oficinas e outras atividades
Material pedagógico Multiplicar x 5 Clica!
Vamos contar D U De 10 até 69 Professor Vaz Nunes 1999 (Ovar-Portugal). Nenhuns direitos reservados, excepto para fins comerciais. Por favor, não coloque.
Investor Relations4Q07 | 1. Investor Relations4Q07 | 2 2.
14/10/09 Uma animação possui: Início; Passo; Fim; 1.
Exercício do Tangram Tangram é um quebra-cabeças chinês no qual, usando 7 peças deve-se construir formas geométricas.
Nome : Resolve estas operações começando no centro de cada espiral. Nos rectângulos põe o resultado de cada operação. Comprova se no final.
Copyright (c) 2003 by Valery Sklyarov and Iouliia Skliarova: DETUA, IEETA, Aveiro University, Portugal.
1 INQUÉRITOS PEDAGÓGICOS 2º Semestre 2003/2004 ANÁLISE GERAL DOS RESULTADOS OBTIDOS 1.Nº de RESPOSTAS ao inquérito 2003/2004 = (42,8%) 2.Comparação.
Sumário Bem ou serviço compósito = dinheiro Exercícios 2 Exercícios 3.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 5.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3.
Curso de ADMINISTRAÇÃO
Percurso não recursivo e impressão em árvores binárias Drozdek.
Relações Adriano Joaquim de O Cruz ©2002 NCE/UFRJ
PERSPECTIVA CONCEITUAL
Pilhas e Filas.
Classificação. 2 Métodos de Classificação Os métodos de classificação podem ser dos tipos: Classificação interna – quando toda a coleção de itens a classificar.
Estruturas Fundamentais
Listas Ordenadas e Listas Classificadas. 2 Sumário Fundamentos Listas Ordenadas Listas Classificadas.
EXPRESSÕES ARITMÉTICAS
Árvores.
Árvores de Busca. 2 Uma árvore que suporta eficientes operações de busca, inclusão e exclusão é chamada de árvore de busca. A árvore é usada para armazenar.
Filas circulares.
EXPRESSÕES ARITMÉTICAS
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Crescimento Econômico Brasileiro : Uma Visão Comparada de Longo Prazo Prof. Giácomo Balbinotto Neto UFRGS.
FUNÇÃO MODULAR.
Exemplos de 3 posições relativas de prédio fronteiro
Mais sobre classes Baseada no Livro: Deitel&Deitel - C++ How To program Cap. 7 Prentice Hall 1994 SCE 213 Programação Orientada a Objetos, ICMC - USP 2.
Aula 4 Nomes, Vinculações, Tipos e Escopos
EXEMPLOS DE ESTRUTURAS PROTENDIDAS
Mecânica dos Sólidos não Linear
Provas de Concursos Anteriores
Renda até 2 SM.
Hamburgo, Alemanha Definir o caminho que irá permitir a Lions Clubs International alcançar o seu potencial pleno como organização.
MECÂNICA - ESTÁTICA Cabos Cap. 7.
Diagnósticos Educativos = Diagnósticos Preenchidos 100% = 1.539
(CESPE/ Técnico Judiciário do TRT 17ª Região/ES) O Superior Tribunal de Justiça entende que o candidato aprovado em concurso público dentro do limite.
MECÂNICA - DINÂMICA Exercícios Cap. 13, 14 e 17. TC027 - Mecânica Geral III - Dinâmica © 2013 Curotto, C.L. - UFPR 2 Problema
Bolha Posição de máx. W2 Ponto de Estagnação
MECÂNICA - ESTÁTICA Vetores Forças Cap. 2.
1 CENTRO DE DESENVOLVIMENTO E PLANEJAMENTO REGIONAL – 2006 P Ó S-GRADUA Ç ÃO EM ECONOMIA Microeconomia I Prof.: Edson Domingues Cap í tulo II: Escolha.
Árvores binárias de pesquisa com balanceamento
1 António Arnaut Duarte. 2 Sumário: primeiros passos;primeiros passos formatar fundo;formatar fundo configurar apresentação;configurar apresentação animação.
CATÁLOGO GÉIA PÁG. 1 GÉIA PÁG. 2 HESTIA PÁG. 3.
Veículos e Sustentabilidade Ambiental
Estruturas de Dados com Jogos
Lemas (Sudkamp)  .
Coordenação Geral de Ensino da Faculdade
Principais operações em Listas TPA Listas Simples Inserção no Final 1.void insereNofinalDaLista(Lista *l, Elemento e){ 2.Lista paux,p; 3. p.
Projeto Marcas que Eu Gosto 1 PROJETO MARCAS QUE EU GOSTO Estudos Quantitativo de Consumidores Janeiro / 2005.
Irradiações 1- Definição 2- Mecânica da Irradiação
C ORROPIOS, C ARDINCHAS E C ÃES G RANDES O LIVRO de José Paixão em imagens – com pistas de leitura propostas por por www.joraga.net.
1 2 Observa ilustração. Cria um texto. Observa ilustração.
SairPróximo Itens de Seleção Probabilidades e Combinatória Cálculo de Probabilidades. Regra de Laplace. ITENS DE SELEÇÃO DOS EXAMES NACIONAIS E TESTES.
MATRICIAL CONSULTORIA LTDA. PREFEITURA MUNICIPAL DE GARIBALDI 23/10/ : ATENÇÃO Os locais descritos nas planilhas anexas não correspondem ao total.
1 Aplicações do Fecho Regular. 2 A interseção de uma linguagem livre de contexto e uma linguagem regular é uma linguagem livre de contexto livre de contexto.
Tipos Especiais de Listas
Olhe fixamente para a Bruxa Nariguda
Máquina de Turing Universal
Caminhos da Cana Relatório e show de imagens Marcos Fava Neves Prof. FEA/USP Ribeirão Preto Purdue University (2013)
Listas Simplesmente Encadeadas
1 - Listas com Acesso Aleatório. 2 - Fila, o Acesso Ordenado (FIFO)
AM020C A interface entre Meio Ambiente, Sociedade e Economia Indicadores de produtividade e empregabilidade da agricultura do Brasil. Aluna Andressa Santos.
Transcrição da apresentação:

Listas Encadeadas Circulares Listas Duplamente Encadeadas

Listas Encadeadas Circulares

Motivação para listas duplamente encadeadas e circulares

LISTAS CIRCULARES Um dos inconvenientes do emprego de listas encadeadas consiste no caso de, dado um ponteiro para um nó p de uma lista encadeada, não se ter acesso aos nós que precedem o nó p Este inconveniente pode ser contornado com o emprego de listas circulares Listas circulares são listas encadeadas nas quais o ponteiro do último nó deixa de ser aterrado para apontar o primeiro nó da lista

LISTAS CIRCULARES Uma lista circular não tem um primeiro nó nem último nó “naturais” Uma convenção útil é apontar o ponteiro externo (“tail” para a lista circular) para o último nó, sendo o conceito de último vindo de tempo de inclusão O ponteiro head torna-se permanentemente aterrado e o ponteiro tail aponta o último elemento da lista Outra alternativa consiste em usar apenas um ponteiro externo head

Listas circulares Ponteiros aterrados representam listas circulares vazias

Listas circulares – inclusão Inclusão de um nó com endereço apontado por tmp na frente e na retaguarda de uma lista circular apontada por tail A inclusão na retaguarda é uma inclusão na frente seguida de tail ← tmp tmp tmp tmp

Listas circulares – exclusão Exclusão do nó da frente de uma lista circular na qual tail aponta o último nó com a recuperação da informação desse nó em y

Implementação Java

Listas circulares – inclusão na frente // frente será o sucessor de tail public void insertFront(Object item){ Element tmp = new Element (item, null); if (tail = null) tail = tmp; else { tmp.next = tail.next; } tail.next = tmp;

Listas circulares – inclusão no final // frente será o sucessor de tail // depois tail será tail.next public void insertRear(Object item){ Element tmp = new Element (item, null); if (tail = null) tail = tmp; else { tmp.next = tail.next; } tail.next = tmp; tail = tmp; // transformar primeiro em último

Listas circulares – exclusão public void extractLast(Object item) { if (tail = null) throw new IllegalArgumentException ("item not found"); Element tmp = tail.next; item = tmp.datum; tail.next = tmp.next if (tail = tmp) tail = null; }

Implementação C++

Listas circulares – Inclusão na frente template <class T> void LinkedList<T>::InsertFront (T const& item) { ListElement<T>* const tmp = new ListElement<T> (item,0); tail->next = tmp; if(tail == 0) tail = tmp; else tmp->next = tail->next; }

Listas circulares – Inclusão no final template <class T> void LinkedList<T>::InsertFront (T const& item) { // frente será o sucessor de tail // depois tail será tail->next ListElement<T>* const tmp = new ListElement<T> (item,0); ptr->next = tmp; if(tail == 0) tail = tmp; else tmp->next = tail->next; } tail->next = tmp; tail = tmp; // transformar primeiro em último

Listas circulares – exclusão template <class T> void LinkedList<T>::ExtractLast (T const& item) { if (tail == 0) throw invalid_argument "item not found"); ListElement<T>* tmp = 0; tmp = tail->next; item = tmp->datum; tail->next = tmp->next if (tail == tmp) tail = 0; delete tmp; }

Listas Duplamente Encadeadas

LISTAS DUPLAMENTE ENCADEADAS Alterando-se os nós de listas encadeadas de forma que cada nó passe a contar, além do registro de informação e do ponteiro para o sucessor, também um ponteiro para antecessor se obtém listas duplamente encadeadas

LISTAS DUPLAMENTE ENCADEADAS

LISTAS DUPLAMENTE ENCADEADAS Uma propriedade característica das listas duplamente encadeadas é expressa por: p.next.prev = p = p.prev.next EXEMPLO

LISTAS DUPLAMENTE ENCADEADAS Memória

LISTAS DUPLAMENTE ENCADEADAS – Inclusão inclusão do nó apontado por q à direita do nó apontado por p

LISTAS DUPLAMENTE ENCADEADAS – Exclusão exclusão do nó apontado por q

Implementação Java

Classe DoubleLinkedList public class DoubleLinkedList { protected Element head; // cabeça protected Element tail; // cauda public final class Element { // elemento do lista Object datum; // dado do elemento ou item Element next; // ponteiro para sucessor Element prev; // ponteiro para antecessor Element(Object datum, Element next, Element prev) { // construtor this.datum = datum; this.next = next; this.prev = prev; } public Object getDatum() // obter dado { return datum; } public Element getNext() // obter sucessor { return next; } public Element getPrev() // obter antecessor { return prev; } // ...

Métodos Construtor e purge public class DoubleLinkedList { protected Element head; protected Element tail; public DoubleLinkedList () // construir uma lista {} public void purge () // esvaziar uma lista head = null; tail = null; } // ...

Métodos getHead, getTail e isEmpty public class DoubleLinkedList { protected Element head; protected Element tail; public Element getHead () // cabeça da lista { return head; } public Element getTail () // cauda da lista { return tail; } public boolean isEmpty () //teste de lista vazia { return head == null; } // ... }

Métods getFirst e getLast public class DoubleLinkedList { protected Element head; protected Element tail; public Object getFirst() { // obter o primeiro elemento //da lista if(head == null) throw new ContainerEmptyException(); return head.datum; } public Object getLast() { // obter o último elemento //da lista if(tail == null) return tail.datum; // ...

Método prepend public class DoubleLinkedList { protected Element head; protected Element tail; // inluir o objeto item no início da lista corrente public void prepend(Object item) Element tmp = new Element(item, head, null); if(head == null) tail = tmp; head.prev = tmp; head = tmp; } // ...

Método append public class DoubleLinkedList { protected Element head; protected Element tail; // incluir o objeto item no final da lista corrente public void append (Object item) Element tmp = new Element (item, null, tail); if(head == null) head = tmp; else tail.next = tmp; tail = tmp; } // ...

Método assign public class DoubleLinkedList { protected Element head; protected Element tail; // a lista corrente será uma cópia da lista list public void assign(DoubleLinkedList list) { if(list != this) purge (); for(Element ptr = list.head; ptr != null; ptr = ptr.next) append (ptr.datum); } // ...

Método extract (1) public class DoubleLinkedList { protected Element head; protected Element tail; // Exclui objeto item public void extract(Object item) Element ptr = head; while(ptr != null && ptr.datum != item) ptr = ptr.next; } if(ptr == null) throw new IllegalArgumentException ("item not found"); if(head == tail) head = null; tail = null;

Método extract (2) { ptr.next.prev = null; head = ptr.next; } else if(ptr == head) // exclui head { ptr.next.prev = null; head = ptr.next; } else if(ptr == tail) // exclui tail ptr.prev.next = null; tail = ptr.prev; ptr.prev.next = ptr.next; ptr.next.prev = ptr.prev; } // fim do extract } // fim da classe DoubleLinkedList

Método insertAfter // Inclui item depois do objeto corrente public void insertAfter(Object item) { Element tmp = new Element (item, next, this); if(tail == this){ this.next = tmp; tail = tmp; } else { this.next.prev = tmp;

Método insertBefore // Inclui item antes do objeto corrente public void insertBefore(Object item) { Element tmp = new Element(item, this, this.prev); if(head == this) { this.prev = tmp; head = tmp; } else { prev.next = tmp; // ...

Implementação C++

Definição das Classes DoubleLinkedList<T> e ListElement<T> (1) template <class T> class DoubleLinkedList; class ListElement { T datum; ListElement* next; ListElement* prev; ListElement (T const&, ListElement*); public: T const& Datum () const; ListElement const* Next () const; ListElement const* Prev() const: friend DoubleLinkedList<T>; };

Definição das Classes DoubleLinkedList<T> e ListElement<T> (2) template <class T> class DoubleLinkedList { ListElement<T>* head; ListElement<T>* tail; public: DoubleLinkedList (); ~DoubleLinkedList (); DoubleLinkedList (DoubleLinkedList const&); DoubleLinkedList& operator = (DoubleLinkedList const&);

Definição das Classes DoubleLinkedList<T> e ListElement<T> (3) ListElement<T> const* Head () const; ListElement<T> const* Tail () const; bool IsEmpty () const; T const& First () const; T const& Last () const; void Prepend (T const&); void Append (T const&); void Extract (T const&); void Purge (); void InsertAfter (ListElement<T> const*, T const&); void InsertBefore (ListElement<T> const*, T const&); };

Definição de Funções Membro da Classe ListElement<T> template <class T> ListElement<T>::ListElement ( T const& _datum, ListElement<T>* _next, ListElement<T>* _prev) : datum (_datum), next (_next), prev (_prev) {} T const& ListElement<T>::Datum () const { return datum; } ListElement<T> const* ListElement<T>::Next () const { return next; } ListElement<T> const* ListElement<T>::Prev () const { return prev; }

Construtor Default da Classe ListElement<T> template <class T> DoubleLinkedList<T>::DoubleLinkedList () : head (0), tail (0) {}

Definição de Funções Membro Destrutor e Purge da Classe ListElement<T> template <class T> void DoubleLinkedList<T>::Purge () { while (head != 0) ListElement<T>* const tmp = head; head = head->next; delete tmp; } tail = 0; DoubleLinkedList<T>::~DoubleLinkedList () { Purge (); }

Definição de Funções Accessor da Classe ListElement<T> template <class T> ListElement<T> const* DoubleLinkedList<T>::Head () const { return head; } ListElement<T> const* DoubleLinkedList<T>::Tail () const { return tail; } bool DoubleLinkedList<T>::IsEmpty () const { return head == 0; }

Definição de Funções First e Last da Classe ListElement<T> template <class T> T const& DoubleLinkedList<T>::First () const { if(head == 0) throw domain_error ("list is empty"); return head->datum; } T const& DoubleLinkedList<T>::Last () const if(tail == 0) return tail->datum;

Definição de Função Prepend da Classe ListElement<T> template <class T> void DoubleLinkedList<T>::Prepend (T const& item) { ListElement<T>* const tmp = new ListElement<T> (item, head, 0); if(head == 0) tail = tmp; head->prev = tmp; head = tmp; }

Definição de Função Append da Classe ListElement<T> template <class T> void DoubleLinkedList<T>::Append (T const& item) { ListElement<T>* const tmp = new ListElement<T> (item, 0, tail); if(head == 0) head = tmp; else tail->next = tmp; tail = tmp; }

Definição de Função Construtor Copy da Classe ListElement<T> (1) template <class T> DoubleLinkedList<T>::DoubleLinkedList (DoubleLinkedList<T> const& DoubleLinkedList) : head (0), tail (0), { ListElement<T> const* ptr; for(ptr = DoubleLinkedList.head; ptr != 0; ptr = ptr->next) Append (ptr->datum); }

Definição de Função Construtor Copy da Classe ListElement<T> (2) template <class T> DoubleLinkedList<T>& DoubleLinkedList<T>::operator = (DoubleLinkedList<T> const& DoubleLinkedList) { if(&DoubleLinkedList != this) Purge (); ListElement<T> const* ptr; for(ptr = DoubleLinkedList.head; ptr != 0; ptr = ptr->next) Append (ptr->datum); } return *this;

Definição de Função Extract da Classe ListElement<T> (1) template <class T> void DoubleLinkedList<T>::Extract (T const& item) { ListElement<T>* ptr = head; while(ptr != 0 && ptr->datum != item) ptr = ptr->next; } if(ptr == 0) throw invalid_argument ("item not found"); if(head == tail) // exclui head head= 0; tail = 0;

Definição de Função Extract da Classe ListElement<T> (2) if(ptr == head) // exclui head { ptr->next->prev = 0; head = ptr->next; } else if(ptr == tail) //exclui tail ptr->prev->next = 0; tail = prevPtr; ptr->prev->next = ptr->next; ptr->next->prev = ptr->prev; delete ptr;

Definição da Função InsertAfter da Classe ListElement<T> template <class T> void DoubleLinkedList<T>::InsertAfter (ListElement<T> const* arg,T const& item) { ListElement<T>* ptr = const_cast<ListElement<T>*> (arg); if(ptr == 0) throw invalid_argument ("invalid position"); ListElement<T>* const tmp = new ListElement<T> (item, ptr->next, ptr); ptr->next = tmp; if(tail == ptr) tail = tmp; else ptr->next->prev = tmp; }

Definição da Função InsertBefore da Classe ListElement<T> (1) template <class T> void LinkedList<T>::InsertBefore (ListElement<T> const* arg, T const& item) { ListElement<T>* ptr = const_cast<ListElement<T>*> (arg); if(ptr == 0) throw invalid_argument ("invalid position"); ListElement<T>* const tmp = new ListElement<T> (item, ptr, ptr->prev);

Definição da Função InsertBefore da Classe ListElement<T> (2) if(head == ptr) {ptr->prev = tmp; head = tmp; } else { ptr->prev = tmp; ptr->prev->next = tmp;