Вы находитесь на странице: 1из 38

12/02/16

Listas

Listas
O conceito de lista usado no quotidiano (e.g., lista de tarefas, lista de compras, lista telefnica).

Uma lista uma coleo ordenada de elementos.

Independentemente da ordem, possvel inserir e remover elementos em qualquer posio.

12/02/16

O TDA Lista
Operaes com listas
Inserir novo elemento na lista (no incio, no fim ou em qualquer outra posio) Remover elemento da lista (do incio, do fim ou de qualquer outra posio) Substituir elemento por outro

O TDA Lista
Mostrar elemento que est numa determinada posio Mostrar a posio de um determinado elemento Verificar se determinado elemento est na lista Verificar se a lista est vazia

12/02/16

Interface do TDA Lista


public interface ListInterface<E> { /** * Adicionar novo elemento lista * @param o referencia do elemento a adicionar */ void addBegin(E o); /** * Verificar se a lista est vazia * @return TRUE se a lista est vazia, seno FALSE */ boolean isEmpty();

Interface do TDA Lista


int size(); void addEnd(E o); void add(E o, int pos); void removeBegin(); void remove(int pos); void removeEnd(); E get(int pos); boolean contains(Object o); int indexOf(E o);

12/02/16

Utilizao da Lista
Considere a organizao de uma maratona. Pretende-se anotar a chegada dos concorrentes pela respectiva ordem.

Cada concorrente tem uma camisola com um nmero (inteiro) que o distingue dos outros concorrentes.

Corrida
public class Corrida {

public static void main(String[] args){ ListInterface<Integer> aMinhaLista; // Usa mtodos de ListInterface aMinhaLista=new AList(); arrivalList(aMinhaLista); displayList(aMinhaLista);

AList implementa a interface ListInterfacet<E>

12/02/16

Corrida
public static void arrivalList(ListInterface<Integer> aList){ aList.addEnd(16); aList.addEnd(4); aList.addEnd(33); aList.addEnd(27);

} //end arrivalList

10

Corrida
public static void displayList(ListInterface<Integer> aList){ int numberOfEntries= aList.size(); System.out.println(A lista contm+ numberOfEntries+concorrentes nas seguintes posies:); for (int pos=1;pos<=numberOfEntries; pos++) System.out.println(aList.get(pos)+ na posio +pos); } //end displayList

}// end Corrida

12/02/16

11 Usar um TDA como usar uma mquina de vendas

12

Utilizadores da mquinas de vendas S podem executar as aces disponveis no exterior da mquina Tm que saber executar essas aces Sem acesso ao interior No preciso conhecer o funcionamento interno

Utilizadores do TDA lista S podem executar operaes do TDA Lista Tm que conhecer as especificaes Acesso aos dados apenas atravs de operaes definidas no TDA Lista pode ser usada mesmo sem acesso directo aos dados

Se o interior da mquina for melhorado e Se a implementao for melhorada, o o exterior permancer inalterado, o cliente programador usa a lista do mesmo utiliza a mquina como sempre o fez modo.

12/02/16

Implementao vetorial do TDA Lista

Sala de aula

Consideremos uma sala de aula com capacidade para 40 alunos

14

12/02/16

15

Sala de aula

Com menos de 40 alunos a sala tem lugares vazios Com mais de 40 alunos no h lugar para todos os alunos

Um vetor como uma sala de aula


Cada lugar uma posio do vector.

16

Sala de aula
Suponhamos que os alunos esto sentados por ordem alfabtica do nome.

Chega um novo aluno


Para manter a ordenao pode ser necessrio deslocar alguns alunos.

Sai um aluno
Para manter a ordenao pode ser necessrio deslocar alguns alunos.

12/02/16

17

A classe Vlist
Nome da classe: VList Atributos theList _________ length ____________ Operaes isEmpty addBegin addEnd get removeBegin removeEnd indexOf add size remove contains ...

18

A classe Vlist
Nome da classe: VList

Atributos

theList: 1 2 3 4 5 6 theList: 2 4 3 4 5 theList _________ length: 6 length: 5


length ____________

Atributos

Atributos

Atributos

theList: 8 2 4 6 length: 4

Operaes

max_size___________ Operaes isEmpty isEmpty addBegin addEnd addBegin addEnd Operaes add get size add get size isEmpty removeBegin remove removeBegin remove addBegin removeEnd contains removeEnd contains addEnd add indexOf ... indexOf ... get size removeBegin remove removeEnd contains

Operaes
isEmpty addBegin addEnd add get size removeBegin remove removeEnd contains indexOf

...

Lista da Ana indexOf

Lista do Joo ...

Lista do Manuel

12/02/16

19

A classe Java Vlist<E>


Atributos
//vector com lista de elementos private E[] theList; // nmero de elementos na lista private int length; // capacidade da lista private static final int MAX_SIZE = 50;

20

Mtodo VList - construtor


public Vlist<E>(){ theList=(E[])new Object[MAX_SIZE]; length=0; } // end default constructor

10

12/02/16

21

Mtodo addEnd
Insere novo elemento no fim da lista Incrementa o atributo length public void addEnd(E item){ theList[length]=item; length++; }

22

Mtodo isEmpty
public boolean isEmpty(){ return length==0; } //end isEmpty

11

12/02/16

23

Mtodo size
public int size() { return length; } //end size

24

Mtodo addBegin
public void addBegin(E item){ for (int i=length;i>0;i--) theList[i]=theList[i-1]; theList[0]=item; length++; } //end addBegin

12

12/02/16

25

Mtodo Add
Pode ser preciso deslocar elementos da lista para a direita.

26

Mtodo add
public void add(E item, int position){ if (isEmpty() || position==1) addBegin(item); //se lista est vazia //ou posio 1, insere no incio else { if (position<=length){ for (int i=0;i<position;i++) theList[length-i]=theList[length-i-1]; theList[length-position+1]=item; length++; } else //posio ltima addEnd(item); } } //end add

13

12/02/16

27

Mtodo get
public E get(int n){ return theList[n-1]; } // end get

28

Mtodo contains
...

14

12/02/16

29

Mtodo removeEnd
public void removeEnd(){ length--; }// end removeEnd

30

Mtodo removeEnd
public void removeBegin(){ for (int i=0;i<length;i++) theList[i]=theList[i+1] length--; } //end removeBegin

15

12/02/16

31

Mtodo Remove
q Pode ser preciso deslocar elementos, excepto se for para retirar o primeiro elemento.

q Considerar as situaes: posio escolhida invlida, lista vazia

32

Mtodo remove
...

16

12/02/16

33

Validao/Verificao
Implementaes dos mtodos anteriores podem ser melhoradas com validao completa dos argumentos.

Como cada vector tem dimenso fixa, importante antes de inserir um elemento, verificar se o vector est cheio. public boolean isFull(){ return length==MAX_SIZE; }//end isFull

Expanso dinmica da dimenso do vector


Quando um vector est cheio possvel copiar o seu contedo para um vector de maior dimenso (expanso dinmica). renomear o novo vector com o nome do original.

34

17

12/02/16

35

Nova implementao da Lista de inteiros


O mtodo isFull j no necessrio (ou ento devolve sempre o valor falso).

Mtodo (de acesso privado) grow para aumentar o espao de memria reservado.

private void grow(){ E[] aux=(E[])new Object[length()+1+MAX_SIZE]; for (int i=0;i<length();i++) aux[i]=theList[i]; theList=aux; }//end grow

36

public class Corrida{

public static void main(String[] args){ ListInterface<Integer> aMinhaLista=new Vlist<Integer>(); arrivalList(aMinhaLista); displayList(aMinhaLista);

18

12/02/16

37

public static void arrivalList(ListInterface<Integer> aList) { aList.addEnd(16); aList.addEnd(4); aList.addEnd(33); aList.addEnd(27); } //end arrivalList public static void displayList(ListInterface<Integer> aList) { int numberOfEntries=aList.length(); System.out.println(A lista contm+numberOfEntries+ concorrentes nas seguintes posies:); for (int position=1;position<=numberOfEntries; position++) System.out.println(aList.get(position)+ na posio +position); } //end displayList }// end Corrida

38

Utilizao de vetores na implementao do TDA Lista

Acesso direto aos elementos da lista Acrescentar elemento no incio da lista simples Acrescentar/retirar elementos requer operao de deslocamento de elementos do vetor. Aumento da capacidade do vetor requer a cpia de todos os elementos.

19

12/02/16

Implementao dinmica do TDA Lista

40

Sala de aula
Consideremos uma sala de aula, onde
cada lugar (mesa/cadeira) criado medida que cada aluno chega

cada lugar tem uma identificao que o distingue dos restantes lugares cada lugar tambm tem uma referncia para o lugar que se segue O professor indica ao aluno que chega o 1 lugar da sequncia

20

12/02/16

41

Sequncia de lugares
q Na sala de aula existe uma sequncia (cadeia) de lugares

42

Construo da sequncia de lugares


Primeiro aluno
Com referncia para o lugar que se segue nula Professor fixa identificao do lugar (10)

21

12/02/16

43

Construo da sequncia de lugares


Segundo aluno
Com referncia para o primeiro lugar (10) Professor fixa identificao do lugar (4)

Construo da sequncia de lugares


Terceiro aluno
Com referncia para o segundo lugar (4) Professor fixa identificao do lugar (20)

44

22

12/02/16

45

Construo de outra sequncia


Primeiro aluno que chega sempre o primeiro da sequncia.

Cada aluno colocado no fim da sequncia.

46

Construo de outra sequncia

23

12/02/16

47

Construo de outra sequncia

48

Mais uma sequncia


Alunos ordenados por ordem alfabtica

Cada aluno pode ser colocado


no incio da sequncia no fim da sequncia entre dois alunos

24

12/02/16

49

Mais uma sequncia

50

Mais uma sequncia

25

12/02/16

51

Mais uma sequncia

52

Remoo do primeiro lugar

26

12/02/16

53

Remoo do lugar 12

54

Remoo do lugar 12

27

12/02/16

55

Remoo do ltimo lugar

56

A classe N
Novo tipo de dados (classe) Cada objeto da classe N (lugar da sala) armazena duas informaes: valor (ou objeto) de determinado tipo referncia nula ou referncia para outro objeto da classe n.

28

12/02/16

57

A classe N

(a) Dois ns de tipo primitivo ligados (b) Dois ns de tipo por referncia ligados

58

A classe N
class Node<E> { private E data; // elemento da lista // ligao ao n seguinte private Node<E> next; public Node (E o) { data=o; next=null; } // end constructor public Node (E o, Node<E> n) { data=o; next=n; } // end constructor

29

12/02/16

59

A classe N
public E getData () { return data; } public Node<E> getNext () { return next; } public void setData (E o) { data=o; } public void setNext (Node<E> n) { next=n; } } // end Node

60

Implementao dinmica do TDA Lista


representao da lista por sequncia de ns

regista referncia para o primeiro n a cabea da lista

a classe N pode ser interior

30

12/02/16

61

A classe Java DList


public class Dlist<E> imlements ListInterface<E> { private Node<E> theHead; // ref. para primeiro n private int length; //nmero de entradas public Dlist<E>() { theHead=null; length=0; } // end constructor public void addEnd(E o) { theHead=new Node<E>(o,theHead); length++; }

62

A classe Java DList


public E head() { return theHead.getData(); }

public boolean isEmpty() { return theHead==null; }

//ou length==0

31

12/02/16

63

A classe Java DList


public void addBegin(E o){ Node<E> n=new Node<E>(o); if (isEmpty()) theHead=n; else { Node<E> aux=theHead; while (aux.getNext()!=null) aux=aux.getNext(); aux.setNext(n); } length++; }

64

A classe Java DList

public void add(E o, int pos){ if (pos<=1) addBegin(o); else if (pos>=length) addEnd(o); else { Node<E> aux=theHead; for (int i=1;i<pos-1;i++) aux=aux.getNext(); aux.setNext(new Node(d,aux.getNext())); length++; } } public void removeBegin(){ theHead=theHead.getNext(); length--; }

32

12/02/16

65

A classe Java DList


public void removeEnd(){ if (theHead.getNext()==null) theHead=null; else { Node<E> aux=theHead; while (aux.getNext().getNext()!=null) aux=aux.getNext(); aux.setNext(null); } length--; }

66

A classe Java DList


public void remove(int pos){ if (pos==1) removeBegin(); else{ Node<E> aux=theHead; for (int i=1;i<pos-1;i++) aux=aux.getNext(); aux.setNext(aux.getNext().getNext()); } length--; } }

33

12/02/16

67

A classe Java DList

public boolean contains(E o){ for (Node<E> aux=theHead;aux!=null;aux=aux.getNext()) if (aux.getData()==o) return true; return false; }// end contains

} // end DList

68

Implementao dinmica do TDA Lista


Memria dinmica

Acrescentar/retirar elementos no necessita de deslocamento

Acesso sequencial aos elementos da lista

34

12/02/16

69

O Programa Corrida
public class Corrida{

public static void main(String[] args){ ListInterface<Integer> aMinhaLista=new Dlist<Integer>(); arrivalList(aMinhaLista); displayList(aMinhaLista); ...

Outras implementaes dinmicas de Listas


Lista ligada apenas com atributo theHead

Lista ligada com referncia adicional para o ltimo elemento

70

35

12/02/16

Outras implementaes dinmicas de Listas


Listas circulares

71

Outras implementaes dinmicas de Listas


Listas duplamente ligadas

Listas circulares duplamente ligadas

72

36

12/02/16

73

Bibliotecas Java
Package java.util

Interface List<E> Classe ArrayList<E> Classe LinkedList<E> (listas com representao dinmica)

74

Java: A Interface List<E>


public interface List<E> extends Collection<E>{! !void add(E elem); !! !void add(int index, E elem);! !E get(int index);! !int indexOf(Object elem);! !int lastIndexOf(Object elem);! !E remove(int index);! !E set(int index, E elem);! !List<E> subList(int min, int max);! !...! }!

37

12/02/16

75

A classe ArrayList<E>
Package java.util

Implementa a interface Java List<E> e guarda os objetos num vetor (com expanso dinmica)

76

A classe LinkedList<E>
Package java.util Implementa a interface Java List<E> com lista duplamente ligada Mtodos adicionais addFirst() addLast() removeFirst() removeLast() getFirst() getLast() ...

38

Вам также может понравиться