Estrutura de Dados Listas

Documentos relacionados
Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Listas Lineares Ordenadas

Professora Jeane Melo

Estruturas de Dados I

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Aula 11 Pilha Dinâmica. prof Leticia Winkler

Métodos Computacionais. Listas Encadeadas

Filas. Nesta aula veremos o ADT fila Em um computador existem muitas filas esperando pela impressora, acesso ao disco ou, num sistema timesharing,

Lista Encadeada (Linked List)

Algoritmos e Estruturas de Dados II IEC013

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

1. Listas sequenciais versus listas ligadas. Lista sequencial

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

2. Listas 3. Listas ligadas simples 4. Operações dentro das listas 5. Listas Circulares 6. Listas Duplamente Ligadas 7. Pilhas 8.

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Pilha e Fila. Pilha em C. Definir o registro que representará cada elemento da pilha.

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Estruturas de Dados Encadeadas

Aula 10 Alocação Dinâmica de Memória Listas Encadeadas. prof Leticia Winkler

S U M Á R I O. Definição de Estrutura de Dados. Vetores. Listas Ligadas. Pilhas. Filas

Módulo 10 Listas Encadeadas

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

SCC122 - Estruturas de Dados. Lista Estática Seqüencial

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Árvores Binárias de Busca (ABB) 18/11

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Tipos Abstractos de Dados (TADs) e Java

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

SCC 202 Algoritmos e Estruturas de Dados I. Listas Lineares Encadeadas Alocação dinâmica

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Estrutura de Dados. Aula 07 Alocação Dinâmica

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 04 Pag.: 1

Algoritmos e Estrutura de Dados. Aula 05 Estrutura de Dados: Listas (Parte II) Prof. Tiago A. E. Ferreira

Pilhas. Algoritmos e Estruturas de Dados I. José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP

Estrutura de Dados. Estrutura de Dados Recursividade. Exemplo: 5! = 5 x 4! 4! = 4 x 3! 3! = 3 X 2! 2! = 2 x 1! 1! = 1 x 0!

ESTRUTURA DE DADOS CIÊNCIA E TECNOLOGIA DO RIO. Curso de Tecnologia em Sistemas para Internet

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.

ESTRUTURA DE DADOS (TCC )

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Criando seu próprio tipo de dado. Prof. Fabrício Olivetti de França

Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Estruturas de Dados Pilhas, Filas, Listas

Alocação dinâmica de Memória

Estrutura de Dados Polinómio

Matrizes esparsas: definição

Tipos de Dados Dinâmicos

Algoritmos e Estruturas de Dados I

CES-11. Pilhas Definição Operações Filas. Operações Deques. Definição. Operações

Modulo 12: alocação dinâmica de memória

Fila. Algoritmos e Estruturas de Dados I

Alocação Dinâmica de Memória. Programação II

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

Módulo 5 Vetores e Alocação Dinâmica

Alocação Dinâmica em C

Tabelas Hash. informação, a partir do conhecimento de sua chave. Hashing é uma maneira de organizar dados que:

Árvores Binárias. 16/11 Representação e Implementação: Encadeada Dinâmica O TAD

Árvores Binárias. 9/11 e 11/11 Conceitos Representação e Implementação

Árvores Binárias de Busca

ÁRVORE BINÁRIA DE BUSCA TDA-ABB

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Listas ordenadas. Listas ordenadas. Listas ordenadas. Listas ordenadas. Listas ordenadas. Listas ordenadas. Definição

Revisão: Tipo Abstrato de Dados Recursividade

Paradigmas de Programação

Árvores binárias de busca

Estruturas de Dados. Filas em que a prioridade de remoção não é cronológica. Maior prioridade não é do elemento que ingressou primeiro

Tipos Abstratos de Dados. Estrutura de Dados

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

Princípios de Desenvolvimento de Algoritmos MAC122

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Módulo 4. Listas Encadeadas. Algoritmos e Estruturas de Dados II C++ (Rone Ilídio)

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

EAD Árvore - representação usando listas ligadas

3.2.2 Pilha (LIFO - last in, first out) - Inserção e remoção apenas no final da lista.

Estrutura de Dados. ! Listas lineares. ! Como manipulá-las: ! estática. ! dinâmicas. ! pilhas. ! filas

Métodos Computacionais. Variações de Listas Encadeadas

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Programação Orientada a Objetos

Busca em Memória Secundária. Busca em Memória Secundária

Árvores. Prof. César Melo DCC/ICE/UFAM

//conteúdo do arquivo Matriz.h class Matriz { private: int *elementos; int numerodelinhas; int numerodecolunas; void setnumerodelinhas(int); void

Universidade de Brasília. Departamento de Ciência da Computação. Curso C: Estruturas. Prof. Ricardo Pezzuol Jacobi

DAINF - Departamento de Informática

Introdução à Computação II (Noturno) BCC Unesp Rio Claro/SP 2015 em PDF via Moodle: Escolha apenas 5 exercícios para entrega Exercício 01 (Pilhas)

Pilhas. ser acessada somente por uma de suas extremidades. pelo topo. S Uma pilha é uma estrutura linear de dados que pode

Instituto Luterano de Ensino Superior de Ji-Paraná Curso Bacharelado em Informática Estrutura de Dados I Prof.: José Luiz A.

Estrutura de Dados II. Prof. Sérgio Portari

INF1007 Programação 2 9 Pilhas. (c) Dept. Informática - PUC-Rio 1

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

16/11/2015 Lista Tipo de dado Lista - Implementação Lista - Implementação Lista - Implementação 3

Linguagem C: Listas Encadeadas

JAVA. José de Siqueira UFMG - ICEx - DCC

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Lista de Figuras Figura 1 1: Figura 1 2: Figura 1 3: Figura 1 4: Figura 1 5: Figura 1 6: Figura 1 7: Figura 2 1: Figura 2 2: Figura 2 3: Figura 2 4:

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

Transcrição:

Universidade Federal da Paraíba Centro de Informática Departamento de Informática Estrutura de Dados Listas 1 Tiago Maritan tiago@ci.ufpb.br

Conteúdos Abordados O Conceito de Listas Listas com Representação Sequencial Listas com Representação Dinâmica Listas Simplesmente Encadeadas Listas Duplamente Encadeadas Listas Circulares 2

Listas O que são Listas? Estruturas de dados lineares que agrupam informações referentes a um conjunto de elementos relacionados. E 1 E 2 E 3... E n-1 E n Exemplos: 3 Lista de clientes de uma agência bancária; Lista de setores de disco a serem acessados por um SO; Lista de pacotes a serem transmitidos em um nó de uma rede de comutação de pacotes.

Listas Conjunto de operações (interface): Criar uma lista vazia; Verificar se uma lista está vazia; Verificar se uma lista está cheia; Inserir um novo elemento após (ou antes) de uma determinada posição na lista; Remover um elemento de uma determinada posição na lista; Exibir os elementos de uma lista, etc. 4

Formas de Representação de Listas Alocação Sequencial Elementos dispostos em posições contíguas de memória Alocação Encadeada Elementos dispostos aleatoriamente na memória, encadeados por ponteiros 5

Listas com Representação Sequencial Conjunto de registros (elementos), onde o sucessor de um elemento ocupa uma posição física subsequente. Exemplo: Arrays E 1 E 2 E 3... E n-1 E n 6

Listas com Representação Sequencial Inserção de um elemento na posição i. Causa o deslocamento a direita de todos os elementos da Lista. Remoção de um elemento na posição i, Requer o deslocamento à esquerda dos elementos E i+1 até o último elemento da Lista. 1 2 i i+1 n E 1 E 2 E i E i+1 E n 7

Listas com Representação Sequencial Vantagens: Acesso ao i-ésimo elemento é imediato; Algoritmos simples. Desvantagens: Não usa memória de forma eficiente Aloca um espaço finito e predeterminado; Intensa movimentação na inserção/remoção de elementos; 8

Listas com Representação Sequencial Quando usar: Listas pequenas; Inserção/Remoção no fim da Lista; Tamanho máximo bem definido. 9

Implementação de Listas Sequenciais Operações Básicas Criação da lista vazia; Verificar se a lista está vazia; Verificar se a lista está cheia; Obter o tamanho da lista; Obter/modificar o valor do elemento de uma determinada posição na lista; Inserir um elemento em uma determinada posição; Retirar um elemento de uma determinada posição. 10

Implementação de Listas Sequenciais public class ListaSeq { // Vetor que contém os dados da lista private int dados[]; private int tamatual; private int tammax; public ListaSeq(){ tammax = 100; tamatual = 0; dados = new int[tammax]; Estrutura do +po 11

Implementação de Listas Sequenciais // Definição das Operações /** Verifica se a Lista está vazia */ public boolean vazia(){ if (tamatual == 0 ) return true; else return false; /**Verifica se a Lista está cheia */ public boolean cheia(){ if (tamatual == tammax) return true; else return false; Operações //continua... 12

Implementação de Listas Sequenciais /**Obtém o tamanho da Lista*/ public int tamanho(){ return tamatual; // continua... 13

Implementação de Listas Sequenciais /** Obtém o i-ésimo elemento de uma lista. Retorna -1 se a posição for inválida. */ public int elemento(int pos){ int dado; /* Se posição estiver fora dos limites <= 0 ou > tamanho da lista */ if ((pos > tamatual) (pos <= 0)) return -1; dado = dados[pos-1]; return dado; //continua... 14

Implementação de Listas Sequenciais /** Retorna a posição de um elemento pesquisado. Retorna -1 caso não seja encontrado */ public int posicao (int dado){ /* Procura elemento a elemento. Se estiver, retorna posição no array+1 */ for (int i = 0; i < tamatual; i++){ if (dados[i] == dado){ return (i + 1); return -1; // continua... 15

Implementação de Listas Sequenciais /**Insere um elemento em uma determinada posição. Retorna true se a insercao funcionar e false caso contrário. */ public boolean insere (int pos, int dado){ if (cheia() (pos > tamatual+1) (pos<=0)){ return false; for (int i = tamatual; i >= pos; i--){ dados[i] = dados[i-1]; dados[pos - 1] = dado; tamatual++; return true; 16

Implementação de Listas Sequenciais /** Remove um elemento de uma determinada posição Retorna o valor do elemento removido e -1 caso a remoção falhe */ public int remove(int pos){ int dado; if ((pos > tamatual) (pos < 1 )) return -1; dado = dados[pos-1]; for (int i = pos - 1; i < tamatual - 1; i++){ dados[i] = dados[i+1]; tamatual--; return dado; 17

18 (

19 Alocação Dinâmica de Memória

Alocação Dinâmica de Memória Feita de acordo com a demanda apresentada durante a execução do programa Pode aumentar ou diminuir durante a execução do programa; Usada quando a quantidade de memória necessária não pode ser determinada a priori Tipos de Dados Dinâmicos São tipos de dados cujo tamanho pode aumentar ou diminuir durante a execução do programa. Ex: Listas Encadeadas. 20

Alocação Dinâmica de Memória em C Feita por meio de ponteiros e funções da biblioteca padrão Incluir: <stdlib.h> FUNÇÃO malloc() calloc() realloc() free() DESCRIÇÃO RESUMIDA Aloca um dado número especificado de bytes em memória e retorna um ponteiro para o início do bloco de memória alocado Similar a malloc(), mas inicia todos os bytes alocados com zeros e permite a alocação de memória de mais de um bloco numa mesma chamada Modifica o tamanho de um bloco previamente alocado Libera o espaço de um bloco de memória alocado com malloc(), calloc() ou realloc() 21

Alocação Dinâmica de Memória em Java e C++ Alocação: Feita por meio do operador new Em Java Passageiro p;... p = new Passageiro(); Em C++ Passageiro *p;... p = new Passageiro(); Liberação: Feita por meio do operador delete (C++) Em Java Em C++ p = null; delete p; 22

Alocação Dinâmica de Memória em Java e C++ Alocação: Feita por meio do operador new Em Java Passageiro p;... p = new Passageiro(); Em C++ Passageiro *p;... p = new Passageiro(); Liberação: p = null; Em Java Na realidade, em Java, a liberação de memória é Em feita C++ automaticamente pelo Garbage Collection. Essa operação delete(p); apenas sugere ao Garbage Collection que a região não é mais usada 23

24 )

25 Listas Simplesmente Encadeadas

Listas Encadeadas São estrutura de dados lineares e dinâmicas. N o de elementos (nós) da lista pode aumentar ou diminuir dinamicamente à medida que novos elementos são inseridos ou removidos Normalmente, inicia vazia e depois os elementos vão sendo inseridos ou removidos um a um. 26

Listas Simplesmente Encadeadas Criando uma abstração para uma LE Nó Lista abstrações 27

Listas Encadeadas Vantagens: Melhor aproveitamento da memória; Menor overhead para inserção/remoção na lista Não há necessidade de deslocamentos de nós Desvantagens: Algoritmos mais complexos; Uso de apontadores; O acesso aos nós deve ser feito de forma sequencial. 28

Lista Simplesmente Encadeada É uma estrutura de dados que consiste de uma sequência de nós cont próximo Cada nó armazena: O conteúdo do elemento Uma ligação para o próximo nó nó A B C D 29

O Tipo (Classe) Nó Possui os campos de informação Possui um campo de ligação com o próximo elemento do tipo Nó As operações sobre nó são: Atualiza informação Atualiza próximo Recupera informação Recupera próximo cont próximo nó 30

Implementação do tipo Nó Em Java: public class No{ private int conteudo; private No proximo; public No(){ prox = null; cont nó próximo // Métodos get e set 31

O Tipo (Classe) Lista Encadeada Possui um campo que referencia o início da lista Também chamado de cabeça da lista (head) Possui um campo que representa o n o total de nós da lista. 32

Implementação do tipo Lista Encadeada Em Java: public class Lista{ private No cabeca; private int tamanho; public Lista(){ cabeca = null; tamanho = 0; 33

Implementação de Listas Encadeadas Operações Básicas Criação da lista vazia; Verificar se a lista está vazia; Verificar se a lista está cheia; Obter o tamanho da lista; Obter/modificar o valor do elemento de uma determinada posição na lista; Inserir um elemento em uma determinada posição; Retirar um elemento de uma determinada posição. 34

Implementação de Listas Sequenciais // Definição das Operações /** Verifica se a Lista está vazia */ public boolean vazia(){ if (tamatual == 0 ) return true; else return false; //continua... 35

Implementação de Listas Encadeadas /**Obtém o tamanho da Lista*/ public int tamanho() { return tamanho; // ou public int tamanho() { No p = cabeca; int cont = 0; while(p!= null){ p = p.getprox(); cont++; return cont; 36

Implementação de Listas Encadeadas /** Obtém o i-ésimo elemento de uma lista Retorna o valor encontrado. */ public int elemento (int pos) { No aux = cabeca; int cont = 1; if (vazia()) return -1; // Consulta falhou if ((pos < 1) (pos > tamanho)) return -1; // Posicao invalida // Percorre a lista do 1o elemento até pos while (cont < pos){ aux = aux.getprox(); cont++; return aux.getconteudo(); 37

Implementação de Listas Encadeadas /**Retorna a posição de um elemento pesquisado. Retorna -1 caso não seja encontrado */ public int posicao (int dado) { int cont = 1; No aux; if (vazia()) return 0; aux = cabeca; while (aux!= null) { if (aux.getconteudo() == dado) return cont; aux = aux.getprox(); cont++; return -1; 38

Implementação de Listas Encadeadas /**Insere um elemento em uma determinada posição Retorna true se conseguir inserir e false caso contrario */ boolean insere(int pos, int dado) { if ((vazia()) && (pos!= 1)) return false; if (pos == 1){ // insercao no inicio da lista return insereiniciolista(dado); else if (pos == tamanho+1){ // inserção no fim return inserefimlista(dado); else{ // inserção no meio da lista return inseremeiolista(pos, dado); 39

Inserção de nó no início da Lista 1. Aloque um novo nó 2. Faça o campo próximo do novo nó apontar para o nó cabeça da lista 3. Atualize o campo que aponta para a cabeça para apontar para o novo nó 4. Incremente o contador de nós 40

Inserção de nó no início da lista /** Insere nó em lista vazia */ private boolean insereiniciolista(int valor) { // Aloca memoria para um novo no */ No novono = new No(); // Insere novo elemento na cabeca da lista novono.setconteudo(valor); novono.setprox(cabeca); cabeca = novono; tamanho++; return true; 41

Inserção de nó no meio da lista 1. Use uma variável auxiliar do tipo Nó para localizar o nó V após o qual se deseja inserir o novo nó 2. Aloque um novo nó 3. Faça o campo próximo do novo nó apontar para o nó apontado pelo campo próximo do nó V 4. Faça o campo próximo do nó V apontar para o novo nó V 42

Inserção de nó no meio da lista /** Insere nó no meio da lista */ private boolean inseremeiolista(int pos, int dado){ int cont = 1; No novono = new No(); // Aloca memoria para novo no novono.setconteudo(dado); // Localiza a pos. onde será inserido o novo nó No aux = cabeca; while ((cont < pos-1) && (aux!= null)){ aux = aux.getprox(); cont++; if (aux == null) return false; novono.setprox(aux.getprox()); aux.setprox(novono); tamanho++; return true; 43

Inserção de nó no fim da lista 1. Localize a cauda da lista 2. Aloque um novo nó 3. Faça o campo próximo do novo nó apontar para null 4. Faça o campo próximo do nó cauda apontar para o novo nó 5. Incremente o contador de nós 44

Inserir o nó no fim da lista em C /** Insere nó no fim da lista */ private boolean inserefimlista(int dado){ No novono = new No(); novono.setconteudo(dado); // Procura o final da lista No aux = cabeca; while(aux.getprox()!= null){ aux = aux.getprox(); 45 novono.setprox(null); aux.setprox(novono); this.tamanho++; return true;

Implementação de Listas Encadeadas /**Remove um elemento de uma determinada posição Retorna o valor a ser removido. -1 se a posição for inválida ou a lista vazia */ public int remove(int pos) { if (vazia()) return -1; // Lista vazia // remoção do elemento da cabeça da lista if (pos == 1){ return removeiniciolista(); // remoção em outro lugar da lista else{ return removenalista(pos); 46

Remover um nó da cabeça da lista 1. Use uma variável auxiliar do tipo Nó para apontar para a cabeça da lista 2. Atualize o campo que aponta para a cabeça da lista para apontar para o próximo nó na lista 3. Libera a memória do nó removido Dispensável em Java 47

Implementação de Listas Encadeadas /** Remove elemento do início da lista */ private int removeiniciolista(){ No p = cabeca; int dado = p.getconteudo(); // Retira o 1o elemento da lista (p) cabeca = p.getprox(); tamanho--; // Sugere ao garbage collector que libere a // memoria da regiao apontada por p p = null; return dado; 48

Remover um nó do meio da lista 1. Use uma variável auxiliar do tipo Nó para localizar o nó anterior V ao nó a ser removido da lista 2. Use uma outra variável auxiliar do tipo Nó para apontar para o nó W a ser removido da lista 3. Faça o campo próximo do nó V apontar para o nó apontado pelo campo próximo do nó a ser removido da lista 4. Libere a memória do nó removido V W 49

Implementação de Listas Encadeadas /** Remove elemento no meio da lista */ private int removenalista(int pos){ No atual = null, antecessor = null; int dado = -1, cont = 1; atual = cabeca; while((cont < pos) && (atual!= null)){ antecessor = atual; atual = atual.getprox(); cont++; if (atual == null) return -1; // continua... 50

Implementação de Listas Encadeadas // retira o elemento da lista dado = atual.getconteudo(); antecessor.setprox(atual.getprox()); tamanho--; // sugere ao garbage collector que libere a memoria // da regiao apontada por p atual = null; return dado; 51

52 Listas Duplamente Encadeadas

Listas Duplamente Encadeadas Listas que permitem a movimentação nos dois sentidos. Nós possuem duas ligações (ponteiros): Uma ligação para o próximo nó; Uma ligação para o nó anterior; ant info prox nó 53

Listas Duplamente Encadeadas Características: Ocupam mais memória do que uma lista simplesmente encadeada. Possibilidade de se movimentar nos dois sentidos simplifica a implementação de algumas funções para listas 54

Inserir novo elemento na lista p A B C p A B C q X p q A B X C

Remover elementos na LDE p A B C D E A B C p E D A B C E

Implementação de Listas Duplamente Encadeadas Operações Básicas Criação da lista vazia; Verificar se a lista está vazia; Obter o tamanho da lista; Obter/modificar o valor do elemento de uma determinada posição na lista; Inserir um elemento em uma determinada posição; Retirar um elemento de uma determinada posição. 57

Implementação de Listas Duplamente Encadeadas (LDEs) public class No{ private No ant; private int conteudo; private No proximo; public class Lista{ private No inicio; private No fim; private int tamanho; public No(){ ant = null; prox = null; // Métodos get e set public Lista(){ inicio = null; fim = null; tamanho = 0; 58

Implementação de LDE // Definição das Operações /** Verifica se a Lista está vazia */ public boolean vazia(){ if (tamatual == 0 ) return true; else return false; //continua... 59

Implementação de LDE /**Obtém o tamanho da Lista*/ public int tamanho() { return tamanho; 60

Implementação de LDE /** Obtém o i-ésimo elemento de uma lista Retorna o valor encontrado. */ public int elemento (int pos) { No aux = cabeca; int cont = 1; if (vazia()) return -1; // Consulta falhou if ((pos < 1) (pos > tamanho)) return -1; // Posicao invalida // Percorre a lista do 1o elemento até pos while (cont < pos){ aux = aux.getprox(); cont++; return aux.getconteudo(); 61

Implementação de LDE /**Retorna a posição de um elemento pesquisado. Retorna -1 caso não seja encontrado */ public int posicao (int dado) { int cont = 1; No aux; if (vazia()) return 0; aux = cabeca; while (aux!= null) { if (aux.getconteudo() == dado) return cont; aux = aux.getprox(); cont++; return -1; 62

Inserção em LDEs /**Insere um elemento em uma determinada posição Retorna true se conseguir inserir e false caso contrario */ boolean insere(int pos, int dado) { if ((vazia()) && (pos!= 1)) return false; if (pos == 1){ // insercao no inicio da lista return insereiniciolista(dado); else if (pos == tamanho+1){ // inserção no fim return inserefimlista(dado); else{ // inserção no meio da lista return inseremeiolista(pos, dado); // continua... 63

Inserção em LDEs /** Insere nó em lista vazia */ private boolean insereiniciolista(int valor) { // Aloca memoria para um novo no */ No novono = new No(); // Insere novo elemento na cabeca da lista novono.setconteudo(valor); novono.setprox(inicio); novono.setant(null); if (vazia()) fim = novono; else inicio.setant(novono); 64 inicio = novono; tamanho++; return true;

Inserção em LDEs /** Insere nó no meio da lista */ private boolean inseremeiolista(int pos, int dado){ int cont = 1; No novono = new No(); novono.setconteudo(dado); No aux = inicio; while ((cont < pos-1) && (aux!= null)){ aux = aux.getprox(); cont++; if (aux == null) { return false; novono.setant(aux); // Nova instrucao novono.setprox(aux.getprox()); aux.getprox().setant(novono); // Nova instrucao aux.setprox(novono); tamanho++; return true; 65

Inserção em LDEs /** Insere nó no fim da lista */ private boolean inserefimlista(int dado){ No novono = new No(); novono.setconteudo(dado); // Procura o final da lista No aux = cabeca; while(aux.getprox()!= null){ aux = aux.getprox(); 66 novono.setprox(null); aux.setprox(novono); novono.setant(fim); fim.setprox(novono); fim = novono; this.tamanho++; return true;

Remoção em LDEs // Remove um elemento de uma determinada posição private int remove(int pos) { int ret; if (vazia()) {return (0); // lista vazia //remoção do elemento de uma lista unitária if ((pos == 1) && (tamanho() == 1)){ return removeiniciolistaunitaria(); //remoção do elemento da cabeça da lista else if (pos == 1){ return removeiniciolista(); // continua... 67

Remoção em LDEs // continua... // remoção no final da lista else if (pos == tamanho()){ return removefimlista(); else{ // remoção no meio da lista return removemeiolista(pos); 68

Remoção em LDEs // Remove elemento do início da lista private int removeiniciolistaunitaria(){ int dado = inicio.getconteudo(); inicio = null; fim = null; tamanho--; return dado; 69

Implementação de Listas Encadeadas /** Remove elemento do início da lista */ private int removeiniciolista(){ No p = cabeca; int dado = p.getconteudo(); // Retira o 1o elemento da lista (p) cabeca = p.getprox(); p.getprox().setant(null); tamanho--; // Sugere ao garbage collector que libere a // memoria da regiao apontada por p p = null; return dado; 70

Implementação de LDEs // Remove elemento do fim da lista private int removefimlista(){ No p = fim; int dado = p.getconteudo(); fim.getant().setprox(null); fim = fim.getant(); tamanho--; p = null; return dado; 71

Implementação de LDEs // Remove elemento do início da lista private int removemeiolista(int pos){ No p = inicio; int n = 1; while((n <= pos-1) && (p!= null)){ p = p.getprox(); n++; if (p == null) return -1; // pos. inválida int dado = p.getconteudo(); p.getant().setprox(p.getprox()); p.getprox().setant(p.getant()); tamanho--; p = null; return dado; 72

73 Listas Circulares

Listas Encadedas Circulares Listas onde o último nó aponta para o 1º elemento. Elas podem ser simples ou duplamente encadeada. Útil quando: Quando se busca a partir de qualquer elemento Não há ordenação na lista 74

Universidade Federal da Paraíba Centro de Informática Departamento de Informática Estrutura de Dados Listas 75 Tiago Maritan tiago@ci.ufpb.br