Você está na página 1de 43

Listas Encadeadas

Fabrcio J. Barth
BandTec - Faculdade de Tecnologia Bandeirantes

Fevereiro de 2011

Disciplina de Estrutura de Dados e Armazenamento

Topicos Principais
Motivacao
Listas encadeadas
Implementacoes recursivas
Listas de tipos estruturados

Listas Encadeadas

T
opicos Principais

Faculdade de Tecnologia Bandeirantes 2

Disciplina de Estrutura de Dados e Armazenamento

Topicos complementares
Listas circulares
Listas duplamente encadeadas

Listas Encadeadas

T
opicos complementares

Faculdade de Tecnologia Bandeirantes 3

Topicos Principais

Disciplina de Estrutura de Dados e Armazenamento

Motivacao
Vetor:
? ocupa um espaco contguo de memoria
? permite acesso randomico aos elementos
? deve ser dimensionado com um n
umero maximo de
elementos

T
opicos Principais

Motivac
ao

Faculdade de Tecnologia Bandeirantes 5

Disciplina de Estrutura de Dados e Armazenamento

Motivacao
Estruturas de dados dinamicas: crescem ou decrescem
`a medida que elementos sao inseridos ou removidos.
Exemplo: listas encadeadas.
Listas encadeadas sao amplamentes utilizadas para
implementar outras estruturas de dados.

T
opicos Principais

Motivac
ao

Faculdade de Tecnologia Bandeirantes 6

Disciplina de Estrutura de Dados e Armazenamento

Listas Encadeadas

sequencia encadeada de elementos, chamados n


os da
lista.
n
o da lista e representado por dois campos:
? a informacao armazenada e
? o ponteiro para o proximo elemento da lista

T
opicos Principais

Listas Encadeadas

Faculdade de Tecnologia Bandeirantes 7

Disciplina de Estrutura de Dados e Armazenamento

a lista e representada por um ponteiro para o primeiro


no
o ponteiro do u
ltimo elemento e NULL.

T
opicos Principais

Listas Encadeadas

Faculdade de Tecnologia Bandeirantes 8

Disciplina de Estrutura de Dados e Armazenamento

Estrutura com ponteiro para ela mesma


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

class Nodo {
private int info;
private Nodo prox;
public int getInfo() {
return info;
}
public void setInfo(int info) {
this.info = info;
}
public Nodo getProx() {
return prox;
}
public void setProx(Nodo prox) {
this.prox = prox;
}
}

T
opicos Principais

Estrutura com ponteiro para ela mesma

Faculdade de Tecnologia Bandeirantes 9

Disciplina de Estrutura de Dados e Armazenamento

Criacao da lista vazia


1
2
3
4
5
6

public class Lista {


private Nodo prim;
public void criaLista(){
prim = null;
}
}

T
opicos Principais

Criac
ao da lista vazia

Faculdade de Tecnologia Bandeirantes 10

Disciplina de Estrutura de Dados e Armazenamento

Listas encadeadas de inteiros: insercao

Aloca mem
oria para armazenar o elemento
Encadeia o elemento na lista existente

T
opicos Principais

Listas encadeadas de inteiros: inserc


ao

Faculdade de Tecnologia Bandeirantes 11

Disciplina de Estrutura de Dados e Armazenamento

Listas encadeadas de inteiros: insercao


1
2
3
4
5
6
7
8
9

/*
* insercao no inicio
*/
public void add(int i){
Nodo novo = new Nodo();
novo.setInfo(i);
novo.setProx(prim);
prim = novo;
}

T
opicos Principais

Listas encadeadas de inteiros: inserc


ao

Faculdade de Tecnologia Bandeirantes 12

Disciplina de Estrutura de Dados e Armazenamento

Exemplo de utilizacao
1
2
3
4
5
6
7

public Main(){
Lista lista = new Lista();
lista.criaLista();
lista.add(45);
lista.add(60);
lista.add(1);
}

T
opicos Principais

Exemplo de utilizac
ao

Faculdade de Tecnologia Bandeirantes 13

Disciplina de Estrutura de Dados e Armazenamento

Funcao que percorre os elementos da lista


1
2
3
4
5

public void print(){


for(Nodo n = prim; n != null; n = n.getProx()){
System.out.println(n.getInfo());
}
}

T
opicos Principais

Func
ao que percorre os elementos da lista

Faculdade de Tecnologia Bandeirantes 14

Disciplina de Estrutura de Dados e Armazenamento

Exemplo de utilizacao
1
2
3
4
5
6
7
8
9
10
11

public Main(){
Lista lista = new Lista();
lista.criaLista();
System.out.println("Imprimindo valores");
lista.print();
lista.add(45);
lista.add(60);
lista.add(1);
System.out.println("Imprimindo valores");
lista.print();
}

T
opicos Principais

Exemplo de utilizac
ao

Faculdade de Tecnologia Bandeirantes 15

Disciplina de Estrutura de Dados e Armazenamento

Funcao que verifica se a lista esta vazia


1
2
3
4
5
6

public boolean
if(prim ==
return
else
return
}

T
opicos Principais

isEmpty(){
null)
true;
false;

Func
ao que verifica se a lista est
a vazia

Faculdade de Tecnologia Bandeirantes 16

Disciplina de Estrutura de Dados e Armazenamento

Funcao de busca
Recebe a informacao referente ao elemento a pesquisar
Retornar o objeto da lista que representa o elemento
ou null, caso o elemento nao seja encontrado na lista.

T
opicos Principais

Func
ao de busca

Faculdade de Tecnologia Bandeirantes 17

Disciplina de Estrutura de Dados e Armazenamento

1
2
3
4
5
6
7
8
9
10
11

/*
* busca por um elemento na lista
*/
public Nodo search(int i){
for(Nodo n = prim; n != null; n = n.getProx()){
if(n.getInfo()==i){
return n;
}
}
return null; /* nao achou o elemento*/
}

T
opicos Principais

Func
ao de busca

Faculdade de Tecnologia Bandeirantes 18

Disciplina de Estrutura de Dados e Armazenamento

Exemplo de utilizacao da funcao de busca


1
2
3
4
5

Nodo temp;
if((temp = lista.search(60)) != null)
System.out.println("Achou "+temp.getInfo());
else
System.out.println("Nao achou o elemento");

T
opicos Principais

Exemplo de utilizac
ao da func
ao de busca

Faculdade de Tecnologia Bandeirantes 19

Disciplina de Estrutura de Dados e Armazenamento

Funcao que retira um elemento da lista


Recebe como entrada o valor do elemento a retirar.
Atualiza o valor do ponteiro para a lista (prim) se o
elemento removido for o primeiro.

T
opicos Principais

Func
ao que retira um elemento da lista

Faculdade de Tecnologia Bandeirantes 20

Disciplina de Estrutura de Dados e Armazenamento

caso contrario, remove apenas o elemento da lista.

T
opicos Principais

Func
ao que retira um elemento da lista

Faculdade de Tecnologia Bandeirantes 21

Disciplina de Estrutura de Dados e Armazenamento

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

public void remove(int i){


/*objeto para o elemento anterior*/
Nodo anterior = null;
/*objeto para percorrer a lista*/
Nodo p = prim;
/*procura elemento na lista, guardando anterior*/
while(p != null && p.getInfo() != i){
anterior = p;
p = p.getProx();
}
/*verifica se achou elemento*/
if(p == null){
/*nao achou: mantem prim da forma como estah*/
return;
}
/*retira elemento*/
if(anterior == null){
/*retira elemento do inicio*/
prim = p.getProx();
}else{
/*retira elemento do meio da lista*/
anterior.setProx(p.getProx());
}
}

T
opicos Principais

Func
ao que retira um elemento da lista

Faculdade de Tecnologia Bandeirantes 22

Disciplina de Estrutura de Dados e Armazenamento

Funcao para liberar a lista


1
2
3
4
5
6
7

public void free(){


while (prim != null){
Nodo temp = prim.getProx();
prim = null;
prim = temp;
}
}

Em Java, quando um objeto nao e mais utilizado, a


JVM e responsavel por desalocar a mem
oria que nao e
mais utilizada.
No entanto, em outras linguagens de programacao o
programador deve explicitamente liberar a mem
oria
consumida pela variavel desnecessaria.
T
opicos Principais

Func
ao para liberar a lista

Faculdade de Tecnologia Bandeirantes 23

Disciplina de Estrutura de Dados e Armazenamento

Manutencao da lista ordenada


Funcao de insercao percorre os elementos da lista ate
encontrar a posicao correta para a insercao do novo.

T
opicos Principais

Manutenc
ao da lista ordenada

Faculdade de Tecnologia Bandeirantes 24

Disciplina de Estrutura de Dados e Armazenamento

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

public void addOrdenado(int i){


Nodo novo;
/*objeto para o elemento anterior*/
Nodo anterior = null;
/*objeto para percorrer a lista*/
Nodo p = prim;
/*procura elemento na lista, guardando anterior*/
while(p != null && p.getInfo() < i){
anterior = p;
p = p.getProx();
}
/*cria novo elemento*/
novo = new Nodo();
novo.setInfo(i);
/*encadeia o elemento*/
if(anterior == null){ /*inseri o elemento no inicio*/
novo.setProx(prim);
prim = novo;
}else{ /*inseri elemento no meio da lista*/
novo.setProx(anterior.getProx());
anterior.setProx(novo);
}
}

T
opicos Principais

Manutenc
ao da lista ordenada

Faculdade de Tecnologia Bandeirantes 25

Disciplina de Estrutura de Dados e Armazenamento

Definicao recursiva de lista


Uma lista e:
uma lista vazia, ou;
um elemento seguido de uma (sub-)lista.

T
opicos Principais

Definic
ao recursiva de lista

Faculdade de Tecnologia Bandeirantes 26

Disciplina de Estrutura de Dados e Armazenamento

Exemplo: funcao recursiva para imprimir


uma lista
se a lista for vazia, nao imprima nada
caso contrario,
? imprima a informacao associada ao primeiro n
o,
dada por prim.getInf o()
? imprima a sub-lista, dada por prim.getP rox(),
chamando recursivamente a funcao.

T
opicos Principais

Exemplo: func
ao recursiva para imprimir uma lista

Faculdade de Tecnologia Bandeirantes 27

Disciplina de Estrutura de Dados e Armazenamento

Funcao imprime recursiva


1
2
3
4
5
6
7
8

public void printRecursivo(Nodo n){


if(!isEmpty(n)){
/*imprime o primeiro elemento*/
System.out.println(n.getInfo());
/*imprime a sub-lista*/
printRecursivo(n.getProx());
}
}

T
opicos Principais

Func
ao imprime recursiva

Faculdade de Tecnologia Bandeirantes 28

Disciplina de Estrutura de Dados e Armazenamento

Funcao imprime recursiva invertida


1
2
3
4
5
6
7
8

public void printRecursivoInvertido(Nodo n){


if(!isEmpty(n)){
/*imprime a sub-lista*/
printRecursivoInvertido(n.getProx());
/*imprime o elemento*/
System.out.println(n.getInfo());
}
}

T
opicos Principais

Func
ao imprime recursiva invertida

Faculdade de Tecnologia Bandeirantes 29

Disciplina de Estrutura de Dados e Armazenamento

Exemplo: funcao para retirar um


elemento da lista
retire o elemento, se ele for o primeiro da lista (ou da
sub-lista)
caso contrario, chame a funcao recursivamente para
retirar o elemento da sub-lista

T
opicos Principais

Exemplo: func
ao para retirar um elemento da lista

Faculdade de Tecnologia Bandeirantes 30

Disciplina de Estrutura de Dados e Armazenamento

Funcao retira elemento recursiva


1
2
3
4
5
6
7
8
9
10
11
12

public Nodo removeRecursivo(Nodo n, int v){


if(!this.isEmpty(n)){
/*verifica se o elemento a
*ser retirado e o primeiro*/
if(n.getInfo()==v){ n = n.getProx();
}else{
/*retira da sub-lista*/
n.setProx(removeRecursivo(n.getProx(),v));
}
}
return n;
}

T
opicos Principais

Func
ao retira elemento recursiva

Faculdade de Tecnologia Bandeirantes 31

Disciplina de Estrutura de Dados e Armazenamento

Igualdade de listas
boolean listasIguais(Nodo l1, Nodo l2)
Implementacao nao recursiva:
percorre as duas listas usando dois ponteiros auxiliares:
? se duas informacoes forem diferentes entao as listas
sao diferentes.
ao terminar uma das listas ou as duas:
? se os dois ponteiros auxiliares sao NULL entao as
duas listas tem o mesmo n
umero de elementos e
sao iguais.

T
opicos Principais

Igualdade de listas

Faculdade de Tecnologia Bandeirantes 32

Disciplina de Estrutura de Dados e Armazenamento

Listas iguais: nao recursiva


1
2
3
4
5
6

public boolean listasIguais(Nodo l1, Nodo l2){


Nodo t1; /*objeto para percorrer l1*/
Nodo t2; /*objeto para percorrer l2*/
for(t1=l1, t2=l2;
t1 != null && t2 != null;
t1=t1.getProx(), t2=t2.getProx()){

if(t1.getInfo() != t2.getInfo())
return false;

8
9

}
return true;

10
11
12

T
opicos Principais

Listas iguais: n
ao recursiva

Faculdade de Tecnologia Bandeirantes 33

Disciplina de Estrutura de Dados e Armazenamento

Igualdade de listas
boolean listasIguais(Nodo l1, Nodo l2)
Implementacao recursiva:
se as duas listas dadas sao vazias entao sao iguais
se nao forem ambas vazias, mas uma delas e vazia,
entao sao diferentes
se ambas nao forem vazias, teste:
? se informacoes associadas aos primeiros nos sao
iguais e
? se as sub-listas sao iguais.
T
opicos Principais

Igualdade de listas

Faculdade de Tecnologia Bandeirantes 34

Disciplina de Estrutura de Dados e Armazenamento

Listas iguais: recursiva


1
2
3
4
5
6
7
8
9
10
11

public boolean listasIguaisRec(Nodo l1, Nodo l2){


if(l1 == null && l2 == null){
return true;
}else if(l1 == null || l2 == null){
return false;
}else
return
((l1.getInfo()==l2.getInfo())
&&
listasIguaisRec(l1.getProx(),l2.getProx()));
}

T
opicos Principais

Listas iguais: recursiva

Faculdade de Tecnologia Bandeirantes 35

Disciplina de Estrutura de Dados e Armazenamento

Listas de tipos estruturados


Lista de tipo estruturado:
a informacao associada a cada no de uma lista
encadeada pode ser mais complexa, sem alterar o
encadeamento dos elementos;
as funcoes apresentadas para manipular listas de
inteiros podem ser adaptadas para tratar listas de
outros tipos.

T
opicos Principais

Listas de tipos estruturados

Faculdade de Tecnologia Bandeirantes 36

Disciplina de Estrutura de Dados e Armazenamento

o campo da informacao pode ser representado por um


objeto para uma estrutura, em lugar da estrutura em
si.
independente da informacao armazenada na lista, a
estrutura do no e sempre composta por:
? um objeto para a informacao e
? um objeto para o proximo no da lista.

T
opicos Principais

Listas de tipos estruturados

Faculdade de Tecnologia Bandeirantes 37

Disciplina de Estrutura de Dados e Armazenamento

Listas de tipos estruturados


1
2
3
4

public class Nodo{


private Aluno al;
private Nodo prox;
}

5
6
7
8
9
10
11
12

class Aluno{
private String nome;
private String matricula;
private float n1;
private float n2;
private float n3;
}

T
opicos Principais

Listas de tipos estruturados

Faculdade de Tecnologia Bandeirantes 38

Disciplina de Estrutura de Dados e Armazenamento

Listas heterogeneas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

public class Nodo{


private FormasGeometricas fg;
private Nodo prox;
}
public class abstract FormasGeometricas{
private float b;
private float h;
public abstract float calculaArea();
}
public class Retangulo extends FormasGeometricas{
public float calculaArea(){
return b*h;
}
}
public class Triangulo extends FormasGeometricas{
public float calculaArea(){
return b*h/2;
}
}

T
opicos Principais

Listas heterog
eneas

Faculdade de Tecnologia Bandeirantes 39

Topicos Complementares

40

Disciplina de Estrutura de Dados e Armazenamento

Topicos Complementares
Listas Circulares
Listas Duplamente Encadeadas

T
opicos Complementares

T
opicos Complementares

Faculdade de Tecnologia Bandeirantes 41

Disciplina de Estrutura de Dados e Armazenamento

Material de consulta
Captulo 10 do livro: Introducao a Estruturas de
Dados do Waldemar Celes, Renato Cerqueira e Jose
Lucas Rangel.

T
opicos Complementares

Material de consulta

Faculdade de Tecnologia Bandeirantes 42

Disciplina de Estrutura de Dados e Armazenamento

Material de refer
encia
Captulo 10 do livro: Introducao a Estruturas de
Dados do Waldemar Celes, Renato Cerqueira e Jose
Lucas Rangel.
Imagens retiradas do site da disciplina de
Programacao II da PUC do Rio de Janeiro.
http://www.inf.puc-rio.br/ inf1007/.

T
opicos Complementares

Material de refer
encia

Faculdade de Tecnologia Bandeirantes 43

Você também pode gostar