listas: conceito e estáticas
TRANSCRIPT
Listas: Conceito e estáticas
Prof: Sergio Souza Costa
Sobre mim
Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular
Roteiro
● Lista: Definição e tipo abstrato de dados.● Lista como estrutura de dados contígua.●
Roteiro
● Lista: Definição e tipo abstrato de dados.● Lista como estrutura de dados contígua.● Lista como estrutura encadeada.● Codificação de listas encadeadas em C.
Exemplos de listas
Coisas a fazer
Catálogo telefônicoCompras
Exemplos de listas
Qual propriedade é comum a todas estas listas ?
Qual propriedade é comum a todas estas listas ?
Linearidade
Um lista L é uma coleção de n elementos x1, x
2, x
3
... Xn, para n >= 0.
Se os elementos x1..x
n são do mesmo tipo a lista é
denominada homogênea, caso contrário é heterogênea.
LISTA: DEFINIÇÃO FORMAL
Se n > 0, entao x1
é o primeiro e xn o último
elemento.
Para i = {1,2,...,n}, xi é precedido por x
i-1 é
seguido por xi+1
.
1
2
3
Se n é igual a 0, então a lista é vazia.4
LISTA: Tipo de dados abstrato
Operação Descrição
Tamanho (L) Retorna o número de elementos de L
Inserir (L,x) Insere um elemento x a L
Busca (L, x) Busca um elemento x em L, retorna seu indice.
ElementoEm(L, i) Retorna um elemento de L localizado em i.
Remove (L, i) Remove um elemento de L localizado em i.
Descrevendo listas como um tipo abstrato de dados, com 5 operações básicas.
Qual a vantagem de descrever as estruturas de dados como tipos abstrato de dados ?
Qual a vantagem de descrever as estruturas de dados como tipos abstrato de dados ?
Abstrair os detalhes da
implementação,
ocultando a
representação
computacional. TAD
define a interface
apenas.
Qual a vantagem de descrever as estruturas de dados como tipos abstrato de dados ?
Abstrair de detalhes
sobre a implementação.
Ocultar a representação
computacional. TAD
define a interface
apenas.
Pode então mudar a
representação
computacional sem que
o cliente da aplicação
“perceba”.
Como representar as listas na memoria do computador?
Como representar as listas na memoria do computador?
Estruturas contíguas
Estruturas Encadeadas
Como representar as listas na memoria do computador?
Estruturas contíguas
Estruturas Encadeadas
Representação computacional na memoria
xxxx xxxx xxxx xxxx . . .
1 2 3 4
xxx
n
x1
x2
x3
x4
xn
Áreas contíguas da memoria, x
2 é
adjacente a x1 e x
3.
Representação computacional na memoria
xxxx xxxx xxxx xxxx . . .
1 2 3 4
xxx
n
x1
x2
x3
x4
xn
Áreas contíguas da memoria, x
2 é
adjacente a x1 e x
3.
Qual estrutura que vocês trabalham que tem esta propriedade?
Representação computacional na memoria
xxxx xxxx xxxx xxxx . . .
1 2 3 4
xxx
n
x1
x2
x3
x4
xn
Áreas contíguas da memoria, x
2 é
adjacente a x1 e x
3.
Qual estrutura que vocês trabalham que tem esta propriedade?
Os arranjos, também conhecido como vetores.
Pode-se implementar uma lista de no máximo MAX elementos, como um arranjo A[1..MAX]. Este arranjo tem um atributo N[A] que retorna a quantidade de elementos.
Para MAX=7, temos o seguinte arranjo A:
Definição
Pode-se implementar uma lista de no máximo MAX elementos, como um arranjo A[1..MAX]. Este arranjo tem um atributo N[A] que retorna a quantidade de elementos.
Para MAX=7, temos o seguinte arranjo A:
Definição
Observem que
vamos empregar
a notação similar
ao do clássico
livro (Cormen)
Operações: Tamanho
15 6 2 9A
1 2 3 4 5 6 7 Tamanho ( A)1. retorna N[A]
N[A] = 4
Operações: Tamanho
15 6 2 9A
1 2 3 4 5 6 7 Tamanho ( A)1. retorna N[A]
N[A] = 4
Como faço para saber se a lista esta vazia ?
Operações: Tamanho
15 6 2 9A
1 2 3 4 5 6 7 Tamanho ( A)1. retorna N[A]
N[A] = 4
Como faço para saber se a lista esta vazia ?
Se Tamanho (A) = 0 então faço algo
Operações: Inserção
15 6 2 9A
N[A] = 4
1 2 3 4 5 6 7
15 6 2 9 20A
N[A] = 5
1 2 3 4 5 6 7
Inserir ( A, 20)
Inserir( A, x)1. Se N[A] < MAX então2. N[A] <- N[A] + 13. A[N[A]] <- x4. se não5. erro (“lista cheia”);
Problema:
Nas estruturas contíguas é a necessário definir o seu tamanho a priori, podendo levar a:
● um superdimensionamento (desperdiço de mémoria) ou
● um subdimensionamento (impossibilidade de inserir mais elementos).
Operações: Busca
Busca ( A, x)1. para i <- 1 ate N[A] faça2. se A[i] = x então3. retorna i4. fim se5. fim para6. retorna 0 15 6 2 9 20A
1 2 3 4 5 6 7
Busca ( A, 2)
15 6 2 9 20A
1 2 3 4 5 6 7
Explorados Não explorados
Operações: Busca
Busca ( A, x)1. para i <- 1 ate N[A] faça2. se A[i] = x então3. retorna i4. fim se5. fim para6. retorna 0 15 6 2 9 20A
1 2 3 4 5 6 7
Busca ( A, 2)
15 6 2 9 20A
1 2 3 4 5 6 7
Explorados Não explorados
Essa busca é conhecida
como linear ou
sequencial, vocês
aprenderam outras
abordagens.
Operações: ElementoEm
ElementoEm( A, i)1. retorna A[i]
15 6 2 9 20A
1 2 3 4 5 6 7
ElementoEm(A, 4) 9
Como são áreas contíguas e indexadas, basta retornar o elemento em A[i].
E a remoção ?
E a remoção ?
Lembre que posso querer remover um elemento em qualquer posição, no inicio, meio ou fim.
E a remoção ?
Lembre que posso querer remover um elemento em qualquer posição, no inicio, meio ou fim.
Precisamos manter as propriedades da lista, x
i+1 suceder x
i.
Operações: Remover
Remover( A, k)1. para i <- k até N[A]-1 faça2. A[i] = A[i+1]3. fim para4. N[A] = N[A] - 15. retorna 0
15 6 9 20 20A
N[A] = 4
1 2 3 4 5 6 7
Remover ( A, 3)
15 6 2 9 20A
N[A] = 5
1 2 3 4 5 6 7
Remove um elemento com um dado índice i.
Movo os elemento de A[i+1..n] para A[i..n].
Pontos chaves
● Estrutura de dados lista é uma das mais importantes e fundamentais.
● Conceito chave da lista é a linearidade, podemos falar em primeiro, segundo ....
● Pode ser codificada usando estruturas contíguas e encadeadas
● Estruturas contíguas o tamanho é dado a priori.