Você está na página 1de 59

Ciência da

Computação

Estruturas de Dados e
Paradigmas
Aula 05
Prof. Anderson Silva
Preliminares

Objetivo da Disciplina
● Conhecer os principais paradigmas de programação,
suas características e aplicabilidade

● Conhecer as principais estruturas de dados, e


ser capaz de utilizá-las para resolver problemas reais.
Preliminares

Plano de Estudos

Aulas Descrição

Unidade 1 - Paradigmas de Programação Paradigmas de Linguagens de Programação

Unidade 2 - Estruturas de Dados Listas, Pilhas e Filas, Árvores Binárias e


AVL, Heaps e Grafos

Unidade 3 - Algoritmos Caminho mais Curto, Bellman-Ford


Floyd-Warshall, Árvore Geradora Mínima

Unidade 4 - Tópicos avançados Estruturas Disjuntas, Tabelas de Dispersão


(hash), Árvore de Fenwick
Unidade 02
Estruturas de Dados
Introdução

Estruturas de Dados
● Listas Lineares

● Ponteiros

● Pilhas e Filas

● Listas encadeadas
Introdução

Exemplo
Você foi contratado para desenvolver o sistema para um site de compras.
O sistema deverá armazenar em memória uma lista de todos clientes
ativos no site: chave do cliente, seu nome e carrinho de compras com até
3 produtos.
Introdução

Exemplo
Você foi contratado para desenvolver o sistema para um site de compras.
O sistema deverá armazenar em memória uma lista de todos clientes
ativos no site: chave do cliente, seu nome e carrinho de compras com até
3 produtos.

chave nome Carrinho


de compras
Introdução

Exemplo
Você foi contratado para desenvolver o sistema para um site de compras.
O sistema deverá armazenar em memória uma lista de todos clientes
ativos no site: chave do cliente, seu nome e carrinho de compras com até
3 produtos.

prod1
CLIENTE
prod2
chave nome Carrinho
de compras
prod3
Introdução

Exemplo
Podemos representar esta lista de
clientes através de uma lista linear.
Nó 0 Nó 1 Nó 2 Nó 3 …

##
Qual deve ser o tamanho máximo chave nome Carrinho
desta lista?
p1 p2 p3
Introdução

Opção 1: Você define o que a lista tem tamanho 100.


Problemas: O site se tornou mais popular do que o previsto, possuindo ao
longo do tempo, mais de 100 clientes simultâneos. O dono da loja
começa a reclamar de lentidão no sistema.
Introdução

Opção 1: Você define o que a lista tem tamanho 100.


Problemas: O site se tornou mais popular do que o previsto, possuindo ao
longo do tempo, mais de 100 clientes simultâneos. O dono da loja
começa a reclamar de lentidão no sistema.

Opção 2: Você define que a lista terá tamanho 500.000.


Porém isso causa enorme demanda de recursos do sistema, mesmo em
momentos em que está sendo pouco acessado. O dono da loja começa a
reclamar que o sistema está lento e travando em operações simples
como consulta, por exemplo.
Introdução

Qual o Problema?
● Alocação estática de memória
○ Reservar pouca memória pode
proporcionar recursos insuficientes
em situações extremas
○ Reservar muita memória pode
ocupar recursos demais mesmo em
situações de pouca carga de dados.
Introdução

Proposta
● Alocação dinâmica de memória
○ Solicita mais memória conforme
uso por parte do sistema.
○ Libera memória em situações em
que esta não está mais sendo
utilizada.
Listas Encadeadas

Alocação Dinâmica de Memória

Saída

>> 10
Listas Encadeadas

Listas Encadeadas
● Reservam dinamicamente memória para cada novo elemento inserido na
lista.
● Memória ocupada é proporcional ao número de elementos presentes na
lista
● Não necessariamente os elementos são armazenados em posições
contíguas
Listas Encadeadas

Valor

Ponteiro para
próximo nó
Listas Encadeadas

Valor

Ponteiro para
próximo nó
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

LISTA
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Nó 0 * Criamos um novo nó

LISTA
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Nó 0 * Criamos um novo nó
Apontamos o início da lista
LISTA
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Nó 0 * Criamos um novo nó

LISTA Nó 1 *
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Nó 0 * Criamos um novo nó
Apontamos para o primeiro
elemento
LISTA Nó 1 *
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Nó 0 * Criamos um novo nó
Apontamos para o primeiro
elemento
LISTA Nó 1 *
Lista aponta para novo nó
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Nó 1 * Nó 0 *

LISTA
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Criamos um novo nó
Nó 1 * Nó 0 *

LISTA Nó 2 *
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Criamos um novo nó
Nó 1 * Nó 0 *
Apontamos para o primeiro elemento

LISTA Nó 2 *
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Criamos um novo nó
Nó 1 * Nó 0 *
Apontamos para o primeiro elemento
Lista aponta para novo nó
LISTA Nó 2 *
Listas Encadeadas

Listas Encadeadas: Inserção


Conceitual

Nó 2 * Nó 1 * Nó 0 *

LISTA
Listas Encadeadas

Listas Encadeadas: Inserção

O novo nó será agora o novo início da lista


Listas Encadeadas

Definições Iniciais
Listas Encadeadas

Função inserir
Listas Encadeadas

Inserção de valores
Listas Encadeadas

Listas Encadeadas: Busca


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave
procurada
Listas Encadeadas

Listas Encadeadas: Busca


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave
procurada
Listas Encadeadas

Listas Encadeadas: Busca


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave
procurada
Listas Encadeadas

Listas Encadeadas: Busca


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave
procurada
Listas Encadeadas

Listas Encadeadas: Busca


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave
procurada
Listas Encadeadas

Listas Encadeadas: Busca


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave
procurada
Listas Encadeadas

Listas Encadeadas: Busca

1. No “p” inicia na primeira posição da lista


Listas Encadeadas

Listas Encadeadas: Busca

1. No “p” inicia na primeira posição da lista


2. Continue enquanto p não nulo
Listas Encadeadas

Listas Encadeadas: Busca

1. No “p” inicia na primeira posição da lista


2. Continue enquanto p não nulo
3. Verifique se chave de “p” é a procurada
Listas Encadeadas

Listas Encadeadas: Busca

1. No “p” inicia na primeira posição da lista


2. Continue enquanto p não nulo
3. Verifique se chave de “p” é a procurada
4. Avance p para próxima posição da lista
Listas Encadeadas

Listas Encadeadas: Busca (Versão recursiva)


Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

Anterior

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

Anterior

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

Anterior

10030 * 10020 * 10010 * 10000 *

LISTA
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

Anterior

10030 * 10020 * 10000 *

LISTA 10010 *
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

Anterior

10030 * 10020 * 10000 *

LISTA 10010 *
10010

Chave a
Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Conceitual

Anterior

10030 * 10020 * 10000 *

LISTA 10010 *
10010
Libera memória do Chave a
nó removido Remover
Listas Encadeadas

Listas Encadeadas: Remoção


Algoritmo
Listas Encadeadas

Listas Encadeadas: Remoção


Algoritmo
Listas Encadeadas

Listas Encadeadas: Remoção


Algoritmo
Listas Encadeadas

Listas Encadeadas: Remoção


Algoritmo
Busca o Elemento
na lista. Usamos
dois ponteiros para
manter uma
referência para o
anterior.
Listas Encadeadas: Variações

Listas Encadeadas Circulares


● Garanta que o último nó aponte para o primeiro.

● Útil quando se deseja acessar os elementos em ordem cíclica:

● Ex. Alocação de Processos em um sistema operacional, trajetória de jogadores


em um tabuleiro.
Listas Encadeadas: Variações

Listas Duplamente Encadeadas


● Cada nó mantém um ponteiro para o próximo nó e o anterior.

● Permite navegação bidirecional na lista.

● Útil quando se deseja acessar os elementos em ordem bidirecional: Ex. A posição


de um cursor em um editor de texto,
Listas Encadeadas

Tarefa:
1. Implemente a função “Listar todos” da lista encadeada
2. Implemente uma função para remover um item de uma
posição específica da lista (exemplo primeiro item,
segundo item, etc)
3. Implemente uma função para inserir um item em uma
posição específica da lista (exemplo inserir na segunda
posição)

Você também pode gostar