Pearson Education Slide 1
Pearson Education Slide 2
Capítulo 17
Criado por Frederick H. Colclough, Colorado Technical University
Estruturas de Dados Ligadas
Pearson Education Slide 3
Objetivos de Estudo Nós e Listas Ligadas
Criando e buscando Aplicações de Listas Ligadas
Pilhas e Filas Classes Amigas e Alternativas Similares
Iteradores Ponteiros como iteradores
Árvores
Pearson Education Slide 4
Introdução Listas Ligadas
Construídas com ponteiros Aumentam e diminuem durante a execução
Árvore também usa ponteiros Estruturas semelhantes a ponteiros
Usam variáveis dinâmicas Standard Template Library
Tem versões predefinidas de algumas estruturas
Pearson Education Slide 5
Abordagens Três formas de lidar com estruturas
comoessas:
1- Abordagem estilo C: funções globais estructs com tudo público
2- Classes com variáveis-membro privadas eempregar funções accessor e mutator
3- Classes amigas Listas ligadas usarão o método 1 Pilhas e filas usarão o método 2 Árvores, o método 3
Pearson Education Slide 6
Nós e Listas Ligadas Listas ligadas
Exemplo simples de uma ‘estrutura de dados dinâmica’ Compostas de nós
Cada ‘nó’ é uma variável do tipo struct ouclasse que é dinamicamente criada com o
operdador new Nós também contêm ponteiros para outros nós Fornecem ‘ligações’
Pearson Education Slide 7
Nós e PonteirosPainel 17.1página 482
Pearson Education Slide 8
Definição de Nó struct NoDaLista
{string item;int contagem;NoDaLista *link;
};typedef NoDaLista* NoDaListaPtr;
A ordem aqui é importante! NoDaLista é definido 1o, uma vez que é usada em
typedef
Observe também a ‘circularidade’
Pearson Education Slide 9
Ponteiro Cabeça Caixa rotulada como ‘cabeça’ não é um
nó: NoDaListaPtr cabeca;
Um ponteiro simples para um nó Aponta para o primeiro nó na lista
Cabeça é usada para ‘manter’ o início da lista Também é usada como argumento para
Funções
Pearson Education Slide 10
Exemplo de Acesso ao Nó
(*cabeca).contagem = 12; Fixa o membro contagem do nó apontado
porcabeca em 12
Operador alternativo, -> Chamado ‘operador seta’ Notação simplificada que combina * e . cabeca->contador = 12;
Idêntico ao exemplo acima cin >> cabeca->item
Atribui a string completa ao membro item
Pearson Education Slide 11
Marcador de Final Use NULL para marcar o final
Considerado ‘sentinela’ para nós Indica que nenhuma ligação virá depois desse nó
Fornece um marcador de final parecido como que nós usamos em vetores parcialmente
preenchidos
Pearson Education Slide 12
Acessando Dados nos NósPainel 17.2
página 484
Pearson Education Slide 13
Listas Ligadas Listas como as mostradas são
chamadas
de Listas ligadas O primeiro nó é chamado Cabeça
Apontada por um ponteiro chamado cabeça O último nó também é especial
Sua variável membro ponteiro é NULL Teste simples para o ‘final’ da lista ligada
Pearson Education Slide 14
Definição da Classe Listas ligadas class NoInt
{public:
NoInt( ){}NoInt(int osDados, NoInt* oLink)
: dados(osDados), link(oLink){}NoInt* getLink( ) const { return link; }int getDado( ) const { return dados; }void setDado(int osDados) { dados = osDados; }void setLink(NoInt* ponteiro) { link = ponteiro; }
private:int dados;NoInt *link;
};typedef NoInt* NoIntPtr;
Pearson Education Slide 15
Classe Listas ligadas Note que todas as definições de funções-
membro são lineares Pequenas e simples o suficiente
Obeserve o construtor de dois parâmetros Permite a criação de nós com um determinado
inteiro como dado e com um membro link específico
Exemplo:NoIntPtr p2 = new NoInt(42, p1);
Pearson Education Slide 16
Crriando o Primeiro Nó NoIntPtr cabeca; Declara a variável ponteiro cabeca cabeca = new NoInt;
Aloca dinamicamente o novo nó Nosso 1o nó na lista, é atribuído a cabeca
cabeca->setDado(3);cabeca->setLink(NULL);
Damos valores às variáveis-membros desse novo nó O membro ponteiro é fixado como igual a NULL,
pois ele é o último e também o primeiro
Pearson Education Slide 17
Adicionando um Nó à Cabeça de uma Lista Ligada
Painel 17.3
página 487
Pearson Education Slide 18
Armadilha: Nós PerdidosPainel 17.5 página 489
Pearson Education Slide 19
Inserindo no Meio de uma Lista Ligada
Painel 17.6
página 490
Pearson Education Slide 20
Removendo um NóPainel 17.7
página 491
Pearson Education Slide 21
Busca em uma Lista Ligada
Função com dois argumentos:
NoIntPtr busca(NoIntPtr cabeca, int alvo);
//Pré-condição: o ponteiro cabeca aponta para a cabeça de uma
//lista ligada. A variável ponteiro no último nó é NULL.
//Se a lista estiver vazia, cabeca é NULL.
//Retorna um ponteiro que aponta para o primeiro nó que contenha o
//alvo. Se nenhum nó contiver o alvo, a função retorna NULL.
‘Passagem’ simples da lista Semelhante a percorrer um vetor
Pearson Education Slide 22
Pseudocódigo Para Função Busca while (aqui não está apontando para um nó contendo
alvo e aqui não está apontando para o último nó)
{
Faz aqui apontar para o próximo nó na lista.
}
if (o nó apontado por aqui contém alvo)
return aqui;
else
return NULL;
Pearson Education Slide 23
Algorítmo Para Função Busca
while (aqui–>getDado( ) != alvo && aqui–>getLink( ) != NULL)
aqui = aqui–>getLink( );
if (aqui–>getDado( ) == alvo)
return aqui;
else
return NULL;
Deve-se fazer um caso ‘especial’ para
listas vazias Não usado aqui
Pearson Education Slide 24
Pilhas Estrutura de dados Pilha:
Acessa dados na ordem inversa em que foram armazenados LIFO – last-in/first-out (primeiro a entrar/último a sair) Pense na pilha como um ‘buraco no chão’
As pilhas são usadas para muitas tarefas: Controle de chamadas de função em C++ Gerenciamento de memória
Nosso uso: Uso em listas ligadas para implementar pilhas
Pearson Education Slide 25
Uma Pilha: GráficoPainel 17.12 página 499
Pearson Education Slide 26
Interface para uma Classe Template Pilha
Painel 17.13página 500
Pearson Education Slide 27
Programa usando a Classe Template Pilha
Painel 17.14 página 501
Pearson Education Slide 28
Pilha: Push (empurrar) e Pop (Saltar para fora)
Acrescente dados à pilha push ‘Empurrando’ os dados para pilha Lembre-se: Vai para o ‘topo’ da pilha
Removendo dados da pilha pop ‘Saltando para fora’ da pilha Lembre-se: removido do ‘topo’ da pilha
Pearson Education Slide 29
Filas Outra estrutura de dados comum:
Lida com os dados no modo first-in/first-out(FIFO) (primeiro a entrar é o primeiro a sair)
Os itens são inseridos no final da lista E removidos na frente
Representação de uma típica formação em ‘linha’
Como as filas de um cinema
Pearson Education Slide 30
Interface para uma Classe Template Fila
Painel 17.16
páginas 504-505
Pearson Education Slide 31
Programa utilizando Classe Template Fila
Painel 17.17
página 505
Pearson Education Slide 32
Classes Amigas Lembre-se do uso constante das funções
de acesso getlink e setlink Talvez você tenha achado muito chato Semelhante a tornar os dados públicos?!
Público torna-se disponível para TODOS!
Use Classes Amigas Torne a classe template fila ‘amiga’ da classe
template nó Todos os membros privados tornam-se
diretamentedisponíveis para as funções-membros classe fila!
Pearson Education Slide 33
Declaração Antecipada O relacionamento de classes requer que
uma faça referência à outra Apresenta o problema Como pode-se declarar ‘ambas’ ao
mesmo tempo? Requerem declaraçao antecipada
Um simples cabeçalho de classe dentro da outraclasse fila; //Declaração antecipada.
Avisa que a ‘classe fila existirá’
Pearson Education Slide 34
Iteradores Construção que permite percorrer em ciclos os
dados Como uma ‘passagem’ Permite ‘qualquer’ ação desejada sobre os
dados Ponteiros são geralmente usados como iteradores
Vistos na implementação de listas ligadas
Pearson Education Slide 35
Ponteiros como Iteradores Lembre-se: Listas ligadas: Estrutura de
dados prototípica Ponteiros: exemplo prototípico de iterador
Usados como um iteradores, percorrendo a lista ligada,
um nó de cada vez, a começar da cabeça da lista: Exemplo:
Tipo_No *iterador;for (iterador = Cabeca; iterador != NULL;
iterador=iterador->Link)
Execute_a_Ação
Pearson Education Slide 36
Classes Iteradoras Mais versátil que ponteiros Possui operadores sobrecarregados:
++ Move o iterador para o próximo item-- Move o iterador para o item anterior== Compara iteradores!= Compara para não-iguais* Acessa um item
Classe de estrutura de dados deve ter membros:begin(): retorna um iterador para o 1o item na estruturaend(): retorna um iterador para testar se chegou ao final
Pearson Education Slide 37
Exemplo de Classe Iteradora Utilizando um iterador, você pode percorrer em
ciclos
os itens em uma estrutura de dados ed, da
seguinte forma:
for (i = ed.begin( ); i != ed.end( ); i++)
processe *i //*i é o item dado atual.
Pearson Education Slide 38
Árvores: Introdução Árvores podem ser complexas estruturas de dados Somente veremos aqui os fundamentos:
Construindo e manipulando Usando nós e ponteiros
Lembre-se das listas ligadas: nós, têm somente
um ponteiro aponta para o próximo nó Árvores têm dois, e as vezes mais ponteiros
para outros nós
Pearson Education Slide 39
Árvore BináriaPainel 17.23página 516
Pearson Education Slide 40
Proriedades das árvores Observe os caminhos
A partir do topo para qualquer nó Nenhum ‘ciclo’ – siga os ponteiros, e alcançará
o final Obeserve que cada nó possui dois links
Chamada árvore binária É o tipo mais comum de árvore
Nó-raiz Similar a cabeca nas listas ligadas
Nós-folhas Ambas as variáveis link são NULL (nenhuma subárvore)
Pearson Education Slide 41
Árvores e Recursão Observe que uma árvore apresenta estrutura recursiva
Cada árvore possui duas subárvores Cada subárvore possui outras duas subárvores
Etc., etc.
Torna as árvores adaptáveis a algorítmosrecursivos
Para busca, especialmente!
Pearson Education Slide 42
Árvore: Processamento Processamento de Ordem Anterior
1. Processar os dados no nó-raiz.2. Processar a subárvore esquerda.3. Processar a subárvore direita.
Processamento em Ordem1. Processar a subárvore esquerda.2. Processar os dados no nó-raiz.3. Processar a subárvore direita.
Processamento de Ordem Posterior1. Processar a subárvore esquerda.2. Processar a subárvore direita.3. Processar os dados no nó-raiz.
Pearson Education Slide 43
Regras de Armazenamento da Árvore Nosso exemplo armazenou valores de uma maneira especial:
Regra de Armazenamento da Árvore de Busca Binária:1- Valores na subárvore da esquerda são menores que o valor na raiz
2- Valores na subárvore da direita são maiores que o valor na raiz 3- Regras se aplicam recursivamente à cada subárvore
Árvores usando esse mecanismo de armazenamento: Chamadas Árvores de Busca Binária (ABB) Passagens:
Em ordem valores ‘em ordem’Ordem anterior notação ‘prefixo’ Ordem posterior notação ‘sufixo’
Pearson Education Slide 44
Sumário 1 Nó é um struct ou objeto de classe
Um ou mais membros são ponteiros Nós podem ser conectados por ponteiros
Poduzem estruturas que podem aumentar e dimi-
nuir de tamanho em tempo de execução Listas ligadas
Listas de nós, onde cada nó aponta para o próximo
O final das listas ligadas são marcados com
um ponteiro NULL
Pearson Education Slide 45
Sumário 2 Pilhas são estrututas de dados LIFO Filas são estruturas de dados FIFO Iterador é uma construção que permite
percorrer em ciclos os dados Estrutura de dados árvore
Nós possuem dois ou mais ponteiros Cada um apontando para outro nó/subárvore
Árvore de Busca Binária Regras especiais de armazenamento que
permitem buscas rápidas