Você está na página 1de 22

Estruturas de Dados – Aula 03

Prof. Dr. Eduardo Takeo Ueda


eduardo.ueda@fatec.sp.gov.br

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
1
Lista linear

• Estrutura de dados na qual cada elemento é precedido por um


elemento e sucedido por outro (exceto o primeiro que não tem
predecessor e o último que não tem sucessor);

• Os elementos estão em uma dada ordem (por exemplo, a ordem


de inclusão ou ordenados por uma chave);

• Uma lista linear pode ser sequencial (estática) ou encadeada


/ligada (dinâmica).

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
2
Lista linear sequencial

É uma lista linear na qual a ordem lógica dos elementos (a ordem


“vista” pelo usuário) é a mesma ordem física (em memória
principal) dos elementos.

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
3
Lista linear encadeada/ligada

É uma lista linear na qual a ordem lógica dos elementos (a ordem


“vista” pelo usuário) não é a mesma ordem física (em memória
principal) dos elementos. Desta forma, cada elemento deverá
indicar quem é seu sucessor.

Alocação dinâmica

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
4
Criando um objeto
• Objeto é uma instância de uma classe;
• Usamos o operador new para criar um objeto.
Variável que conterá uma
referência a um objeto

ContaCorrente minhaConta;
minhaConta = new ContaCorrente ( );

Criação do objeto

ContaCorrente minhaConta = new ContaCorrente ( );


Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
5
Objeto Node

element next

Node

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
6
Classe Node
public class Node {
private String element; //Elemento do Node é uma string
private Node next; //Referência para um objeto Node
//Cria um node com um elemento e uma referência para o próximo node
public Node(String s, Node n){
element = s;
next = n;
}
//Cria um node com um elemento e uma referência null
public Node(String element) {
this(element, null);
}
//Retorna o elemento deste node
public String getElement(){ return element; }
//Retorna a referência para o próximo node
public Node getNext(){ return next; }
//Define o elemento deste node
public void setElement(String newElem){ element = newElem; }
//Define a referência para o próximo node
public void setNext(Node newNext){ next = newNext; }
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
7
Lista simplesmente encadeada/ligada

• Uma lista simplesmente encadeada/ligada é uma sequência de


objetos alocados dinamicamente, onde cada objeto faz referência
ao seu sucessor na lista;
• Lista encadeada/ligada básica:
o possui variável head que referencia o primeiro elemento da lista;
o cada objeto referencia seu sucessor;
o último elemento contém a referência null (para indicar que não
referencia nenhum outro).

Ineficiente: se queremos inserir um elemento no final da lista, temos


que localizar o último elemento, e para tanto é necessário
percorrer todos os elementos da lista.

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
8
Lista simplesmente encadeada/ligada

• Podemos tornar a estrutura mais eficiente:


o utilizar uma segunda variável, chamada tail, que referencia o último
elemento da lista;
o eficiência obtida a custa do espaço adicional.

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
9
Operações sobre listas encadeadas

 public boolean isEmpty()


• verifica se a lista está vazia

 public Node getFirst()


• retorna o primeiro elemento da lista, sem removê-lo

 public Node getLast()


• retorna o último elemento da lista, sem removê-lo

 public void insertFirst(Node novoNode)


• insere element na frente da lista

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
10
Operações sobre listas encadeadas

 public void insertLast(Node novoNode)


• insere element no final da lista

 public Node removeFirst()


• remove e retorna o primeiro elemento da lista

 public Node removeLast()


• remove e retorna o último elemento da lista

 public void show()


• exibe o conteúdo da lista

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
11
Antes de começarmos…
Supondo a existência da classe JLinkedList, desenhe a lista criada
através do código abaixo (a saída do programa):
public static void main(String args[]) {
JLinkedList lista = new JLinkedList();
try {
lista.insertFirst(new Node("D"));
lista.insertFirst(new Node("A"));
lista.insertFirst(new Node("B"));
lista.insertLast(new Node("S"));
lista.insertLast(new Node("C"));
lista.removeFirst(); //pode lançar UnderflowException
lista.removeLast(); //pode lançar UnderflowException
} catch (UnderflowException e) {
System.out.println("ERRO: Impossível remover!");
e.printStackTrace();
}
lista.show();
}
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
12
Lista encadeada/ligada

/** Lista simplesmente encadeada/ligada **/


public class JLinkedList {
protected Node head; //node cabeça da lista
protected Node tail; //node cauda da lista
protected long size; //número de nodes da lista
// Construtor default que cria uma lista vazia
public JLinkedList(){
head = null;
tail = null;
size = 0;
}
//demais métodos...
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
13
Classe UnderflowException

public class UnderflowException extends Exception {


public String toString() {
return "UNDERFLOW!";
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
14
isEmpty(), getFirst() e getLast()
public boolean isEmpty() {
return head == null;
}

public Node getFirst() throws UnderflowException {


if (isEmpty()) {
throw new UnderflowException();
}
return head;
}

public Node getLast() throws UnderflowException {


if (isEmpty()) {
throw new UnderflowException();
}
return tail;
}
Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
15
Inserção no início da lista

public void insertFirst(Node novoNode) {


novoNode.setNext(head);
head = novoNode;
size++;
if (size == 1) {
tail = head;
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
16
Inserção no final da lista

public void insertLast(Node novoNode) {


if (isEmpty()) {
insertFirst(novoNode);
} else {
novoNode.setNext(null);
tail.setNext(novoNode);
tail = novoNode;
size++;
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
17
Remoção no início da lista

public Node removeFirst() throws UnderflowException {


if (isEmpty()) {
throw new UnderflowException();
}
Node removedItem = head;
if (head == tail) {
head = tail = null;
} else {
head = head.getNext();
}
size--;
return removedItem;
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
18
Remoção no final da lista
public Node removeLast() throws UnderflowException {
if (isEmpty()) {
throw new UnderflowException();
}
Node removedItem = tail;
if (head == tail) {
head = tail = null;
} else {
Node current = head;
while (current.getNext() != tail) {
current = current.getNext();
}
tail = current;
current.setNext(null);
}
size--;
return removedItem;
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
19
Mostrar/exibir elementos da lista

public void show() {


if (isEmpty()) {
System.out.println("Lista vazia!");
} else {
System.out.print("A lista é: ");
Node current = head;
while (current != null) {
System.out.print(current.getElement().toString() + " ");
current = current.getNext();
}
System.out.println("\n");
}
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
20
Atividade
 Considerando que a lista encadeada/ligada tenha apenas a variável
head para o primeiro elemento, como apresentado abaixo,
implemente as operações isEmpty(), getFirst(), getLast(),
insertFirst(), insertLast(), removeFirst(), removeLast(), show().

/** Lista simplesmente encadeada/ligada **/


public class JLinkedList {
protected Node head; //node cabeça da lista
// Construtor default que cria uma lista vazia
public JLinkedList(){
head = null;
}
//demais métodos...
}

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
21
Fim!

Estruturas de Dados
Tecnologia em Análise e Desenvolvimento de Sistemas
Fatec Zona Leste
22

Você também pode gostar