Profa. Dra. Laura Rodríguez E-mail: [email protected] Universidade da Madeira 1. 2. 3. 4. 5. 6. 7. 8. Introdução Listas Listas ligadas simples Operações dentro das listas Listas Circulares Listas Duplamente Ligadas Pilhas Filas Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2 1 Um Tipo Abstrato de Dados (TAD) é um modelo matemático de um conjunto de dados Basicamente, a definição de um TAD inclui: o tipo dos dados as operações que agem sobre esses dados * Hermes Senger, Algoritmos e Estruturas de dados 2003 Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 3 A definição de um TAD não inclui: detalhes sobre o formato de armazenamento dos dados detalhes de implementação das operações A definição de um TAD indica o quê faz cada operação, e não como Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 4 2 Estruturas de dados incluem detalhes de implementação TADs são materializados através de estruturas de dados Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 5 Vantagens: Acesso muito rápido através do índice de cada elemento. Permitem implementar facilmente a pesquisa binária. Desvantagens: Tamanho máximo fixo, o que implica que mesmo quando vazias ocupam um grande espaço na memória. Os elementos da tabela têm de estar contíguos na memória. As inserções ou remoções de novos valores no meio de uma tabela ordenada implicam normalmente a movimentação de grande número dos seus elementos. Se o tamanho da tabela aumenta frequentemente então é necessário redimensionar a sua capacidade. Isto implica uma nova alocação de memória e uma cópia de dados de um lado para o outro. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 6 3 1. Introdução 2. Listas 3. 4. 5. 6. 7. 8. Listas ligadas simples Operações dentro das listas Listas Circulares Listas Duplamente Ligadas Pilhas Filas Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 7 Uma lista é uma sequência a1, a2,..., an (n ≥0) de elementos, todos de um mesmo tipo n é o comprimento da lista Dado um elemento ai , dizemos que ai-1 seu antecessor (0<i n) Dado um elemento ai , dizemos que ai+1 seu sucessor (0 i <n) Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 8 4 iniciar (): inicia a estrutura de dados incluirFim (X): acrescenta um objeto X ao fim da lista excluirFim (X): retira e retorna o último elemento da lista isEmpty(): retorna um valor booleano, indicando que a lista est vazia exibir(): exibe todos os elementos da lista Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 9 ! Uma forma simples de implementar o TAD Lista é usar um vetor Elementos são inseridos da esquerda para direita A variável quant controla a quantidade de elementos no vetor (último é quant - 1) ← ← − ← " Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 10 5 ## ! " #$ $% &' $ ( & ) $ ( & +) % &' )' * )' , Estruturas de dados e algoritmos Profa. Dra. Laura Rodríguez 11 $ $ ( &#$ -- #$ & ' )' $ (. / 001 !#$ "-) 22 $ 03/+001 , , Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 12 6 % ! Repare que X deve ser passado por referencia ) $ ( & + $ & * )' &'' (. / 001 )#$ $ !#$ " 44 03/+001 , , Estruturas de dados e algoritmos Profa. Dra. Laura Rodríguez % &#$ $ + 5- ' $ 13 &' $ , Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 14 7 &'& 1. Implemente as seguintes operações: inserirPosicao (X, p): acrescenta um novo valor X na posi ão p da lista Obs.: cuidado para não sobrepor ou perder valores existentes na lista lerPosicao (X, p): retorna (na vari vel X) o valor que ocupa a posi ão p da lista removerPosicao (X, p): remove e retorna o valor que ocupa a posi ão p da lista Obs.: ao final desta opera ão, quant deve ter sido decrementado, e o valor retirado não deve estar mais poresente na lista Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 15 OTAD Lista modela uma seqüência de objetos arbitrários estocados em certas posições Permite remover e insertar nós dentro da lista Métodos de consulta: isFirst(p), isLast(p) Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 16 8 Métodos de acesso: first(), last() before(p), after(p) Métodos de atualização: replaceElement(p, o), insertBefore(p, o), insertAfter(p, o), insertFirst(o), insertLast(o) remove(p) Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 17 &'& 2. O que aconteceria se o vetor todo fosse preenchido, e alguém solicitasse uma nova inclusão? Você vê algum modo de resolver isso? Dica: tente implementar um vetor que “cresce”, dobrando o seu tamanho toda vez que isso acontecer. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 18 9 1. Introdução 2. Listas 3. Listas ligadas simples 4. 5. 6. 7. 8. Operações dentro das listas Listas Circulares Listas Duplamente Ligadas Pilhas Filas Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 19 ( Foram pensadas para resolver alguns dos problemas resultantes da utilização de tabelas no armazenamento de dados do mesmo tipo. As listas ligadas são constituídas por vários «nós» que armazenam os dados pretendidos. Cada nó armazena o tipo de dados da lista e um ponteiro para o próximo nó. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 20 10 ( A lista pode crescer dinamicamente para o tamanho que se pretender (o limite é apenas determinado pela memória disponível). As inserções e remoções não implicam o deslocamento dos outros elementos. Cada elemento da lista (cada nó) referencia o próximo e é alocado dinamicamente apenas quando é necessário, o que implica que é apenas reservado espaço para os dados. Para referenciar o primeiro elemento da lista utilizase um ponteiro que se designa por cabeça da lista. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 21 ) Uma lista ligada simples é uma estrutura de dados composta por nós Cada nó contém um elemento ponteiro para próximo nó ∅ Cabeça da lista NULL Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 22 11 & *+ 44444 6 %7 44444 6 89 $% 89 : $ $ 89 ) , Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 23 $ template <class T> class CListaLigada { CNoLista<T> *Cabeca; // Ponteiro para o primeiro elemento public: CListaLigada(void); ~CListaLigada(void); void InsereItem(const T Item); void ApagaItem(const T Item); bool ProcuraItem(const T Item); void EscreveLista(void); … }; Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 24 12 $ Construtor: template <class T> CLista<T>::CLista(){ Cabeca=NULL; } Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 25 $ Destrutor: template <class T> CLista<T>::~CLista(){ CNoLista<T> *Actual,*Proximo; if(Cabeca!=NULL){ Actual=Cabeca; while(Actual!=NULL){ Proximo=Actual->Proximo; delete Actual; Actual=Proximo; } Cabeca=NULL; } } Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 26 13 1. 2. 3. Introdução Listas Listas ligadas simples 4. Operações dentro das listas 5. 6. 7. 8. Listas Circulares Listas Duplamente Ligadas Pilhas Filas Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 27 *+ Exemplo da inserção: NULL Os restantes elementos não foram deslocados o que implica que a inserção de um novo elemento numa lista é mais rápido do que a mesma operação numa tabela. * Paulo Peixoto, Estruturas de dados e Algoritmos, 2004 Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 28 14 '& 1. Aloque um novo nó 2. Insira o elemento 3. Guarde o endereço do antigo primeiro 4. Atualize o ponteiro do primeiro Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 29 , 1. Criar o novo nó 2. Guardar os dados no novo nó 3. Se a lista estiver vazia Colocar a cabeça da lista a apontar para o novo nó Caso contrário Percorrer a lista até atingir o último nó. Faça o novo nó apontar para NULO Faça o ex-último nó apontar para o novo 4. Fim Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 30 15 -. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 31 ! Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 32 16 -. Profa. Dra. Laura Rodríguez & Estruturas de dados e algoritmos 33 / Actual=Cabeca; while(Actual->Proximo!=NULL) Actual=Actual->Proximo; Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 34 17 ! Percorrer toda a lista, escrevendo todos os seus elementos (travessia): while(Actual!=NULL){ cout << Actual->Dados << ", "; Actual=Actual->Proximo; } Profa. Dra. Laura Rodríguez -. Estruturas de dados e algoritmos & ! 35 01 template <class T> void CLista<T>::EscreveLista(void) { CNoLista<T> *Actual=Cabeca; if(Cabeca==NULL) cout << "Lista Vazia..." << endl; else { while(Actual!=NULL){ cout << Actual->Dados << ", "; Actual=Actual->Proximo; } cout << "FIM" << endl; } } Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 36 18 2 & Percorrer toda a lista à procura de um determinado elemento: while(Actual!=NULL){ if(Actual->Dados==Item) return(true); Actual=Actual->Proximo; } Profa. Dra. Laura Rodríguez -. Estruturas de dados e algoritmos 2 & 37 01 template <class T> bool CLista<T>::ProcuraItem(T Item) { CNoLista<T> *Actual=Cabeca; if(Cabeca==NULL) return(false); else{ while(Actual!=NULL) { if(Actual->Dados==Item) return(true); Actual=Actual->Proximo; } return(false); } } Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 38 19 % ! 1. Guarde o endereço do primeiro em pt_aux 2. Atualize o endereço do primeiro 3. Remova o primeiro nó $) ∅ $) ∅ ∅ Profa. Dra. Laura Rodríguez % Estruturas de dados e algoritmos ! 39 3 Remover o último elemento de uma lista ligada simples não é uma operação eficiente!!! Não existe algoritmo de tempo constante para atualizar ponteiro de fim para apontar para o antecessor É preciso usar um loop … Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 40 20 Dado um determinado elemento pertencente à lista, eliminá-lo desta Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos -. Profa. Dra. Laura Rodríguez 41 01 Estruturas de dados e algoritmos 42 21 & Profa. Dra. Laura Rodríguez -. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 43 01 ! 4 Estruturas de dados e algoritmos 44 22 1. 2. 3. 4. Introdução Listas Listas ligadas simples Operações dentro das listas 5. Listas Circulares 6. Listas Duplamente Ligadas 7. Pilhas 8. Filas Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 45 Estruturas de dados e algoritmos 46 & Profa. Dra. Laura Rodríguez 23 & Método EscreveLista(): template <class T> void CLista<T>::EscreveLista(void){ CNoLista<T> *Actual=Cabeca; if(Cabeca==NULL) cout << "Lista Vazia..." << endl; else{ do{ cout << Actual->Dados << ", "; Actual=Actual->Proximo; } while(Actual!=Cabeca) cout << "FIM" << endl; } } Actual Profa. Dra. Laura Rodríguez 1. 2. 3. 4. 5. Estruturas de dados e algoritmos 47 Introdução Listas Listas ligadas simples Operações dentro das listas Listas Circulares 6. Listas Duplamente Ligadas 7. Pilhas 8. Filas Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 48 24 5 Cada nó possui um ponteiro para o seu sucessor e para seu antecessor Pode ser percorrida nos dois sentidos ∅ ∅ ; / Estruturas de dados e algoritmos Profa. Dra. Laura Rodríguez & 6 49 & Pode ser interessante implementar um nó especial, com informações como inicio, fim, e quantidade de elementos ∅ ∅ Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 50 25 6 6$ 8 8 8 $% 8 : <: $ : :$ #$ $% , &' $ = ) $ = ) % &' + &' % & & )' * )' , Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 51 6 -. 017 template <class T> void CLista2<T>:: InsereItem(T Item) { No<T> *Novo=new No<T>; No<T> *Actual; Novo->Dados=Item; Novo->Proximo=NULL; Novo->Anterior=NULL; if(Cabeca==NULL){ Cabeca=Novo; } else { Actual=Cabeca; while(Actual->Proximo!=NULL) Actual=Actual->Proximo; Actual->Proximo=Novo; Novo->Anterior=Actual; } } Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 52 26 6 -. 017 if(Cabeca==NULL) { Cabeca=Novo; } else { Actual=Cabeca; while(Actual->Proximo!=NULL) Actual=Actual->Proximo; Actual->Proximo=Novo; Novo->Anterior=Actual; } Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 53 &'& Implemente as funções básicas de manipulação de listas duplamente encadeadas, que constam na declaração da classe ListaDup 2. Proponha e implemente outras operações sobre listas duplamente encadeadas 1. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 54 27