Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

30
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Transcript of Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Page 1: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II

Prof. Mateus Raeder

Universidade do Vale do Rio dos Sinos- São Leopoldo -

Page 2: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Tipos de dados

• Tipos primitivos– inteiro, real, lógico (boolean), caracter

• Estrutura de dados– Conjunto de informações agrupadas de uma forma

coerente (com alguma relação entre elas)• Ex.: lista de chamada da turma

Tipos de dados

Primitivos: a partir dos quais podemos definir os demais

Estrutura de dados: constituídos de dados primitivos e/ou estruturas

Page 3: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Tipo Abstrato de Dados (TAD)

• Um tipo abstrato de dados é a especificação matemática de um conjunto de dados e das operações que podem ser executadas sobre estes dados

• Os TADs definem o que cada operação faz, mas não como faz– assim, um mesmo tipo abstrato de dado pode ser

implementado de diferentes formas• TADs são materializados pela estruturas de

dados.– Lista Encadeada (implementação com referências)– Lista com alocação estática (implementação usando

arrays)• Em Java: TAD pode ser expresso por uma

interface

Page 4: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas Lineares

• A Lista Linear é uma estrutura que permite representar um conjunto de dados de forma a preservar a relação de ordem existente entre eles

• Uma lista linear é um conjunto de n > 0 nós L[1] , L[2], ..., L[n], onde:– Se n>0, L[1] é o primeiro nó– Para 1<k<=n, o nó L[k] é precedido por L[k-1]

Page 5: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas Lineares

• Ordenação implícita– L[1] e L[n] são, respectivamente, o primeiro e o último

nó– se 1 < k < n, então:

• L[k] é precedido por L(k-1)• L[k] é seguido por L(k+1)

– Se n=0, dizemos que a lista é vazia

...1 2 3 4 n

Page 6: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Estrutura dos nós

• Estrutura interna é abstraída

Page 7: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Exemplos de aplicações com listas

• Notas de alunos• Cadastro de funcionários de uma empresa• Itens em estoque de uma empresa• Dias da semana• Vagões de um trem• Letras de uma palavra• Pessoas esperando o ônibus• Cartas de baralho• Torcedores do grêmio

Page 8: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas Lineares: Classificação

Listas lineares

Listas lineares geraisSEM restrição de inserção e remoção de elementos

Listas particularesCOM restrição de inserção e remoção de elementos

Page 9: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas lineares

• Nas listas lineares gerais, a inclusão e remoção de elementos pode ser realizada em qualquer posição da lista. Essas listas não apresentam nenhuma restrição de acesso.

• Casos particulares de listas:– Pilha– Fila– Deque

Page 10: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas: tipos de armazenamento

• O tipo de armazenamento de uma lista linear pode ser classificado de acordo com a aposição relativa na memória (contígua ou não) de dois nós consecutivos na lista– Lista linear com alocação estática de memória

• Chamada de Lista Sequencial• Nós em posições contíguas de memória• Geralmente representado por arrays• Útil para implementar filas e pilhas (controle de início e fim)

Page 11: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas: tipos de armazenamento

• O tipo de armazenamento de uma lista linear pode ser classificado de acordo com a aposição relativa na memória (contígua ou não) de dois nós consecutivos na lista– Lista linear com alocação dinâmica de memória

• Chamada de Lista Encadeada• Posições de memória são alocadas a medida que são

necessárias• Nós encontram-se aleatoriamente dispostos na memória e

são interligados por ponteiros, que indicam o próximo nó– Nós precisam de um campo a mais

Page 12: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas: tipos de armazenamento

...1 2 3 4 n

...1 2 3 4 n

Lista sequencial

Lista encadeada

Page 13: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas Lineares Gerais

• Sem restrição de acesso (inserções ou remoções podem ser realizadas em qualquer posição, inlusive no meio da lista)– Ex.: Lista de chamada dos alunos da turma

• Cada nó é formado por campos que armazenam as características distintas das listas

• Cada nó possui uma chave (campo) identificador– Lista Ordenada: os nós encontram-se ordenados

segundo os valores de suas chaves– Lista Não Ordenada: os nós não estão ordenados

Page 14: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Operações sobre listas lineares

• Verificar se lista está cheia• Verificar se lista está vazia• Inserção de um nó na i-ésima posição• Inserção de nó no final da lista• Exclusão do i-ésimo nó• Acesso ao i-ésimo nó• Exibir conteúdo dos nós da lista• Alteração do i-ésimo nó• Localizar nó através da chave• Combinação de duas ou mais listas• Classificação da lista• Cópia da lista

Page 15: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Listas Lineares Gerais com Alocação Estática ou Listas Sequenciais

Page 16: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

• Alocação estática!!• Suponhamos uma lista geral de números inteiros

L que, em certo momento, possui os seguintes 7 elementos:

1 6 9 -3 0 3 5• Declarando um array de inteiros de nome L com

MAX=10 elementos (L[0..MAX-1]), teremos a seguinte lista:

1 6 9 -3 0 3 5

Page 17: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Exercício Lista Sequencial

• Dada a lista acima, realize as operações abaixo (cumulativamente) e desenhe a lista resultante em cada passo:– Inserir 7 no final – Retirar o primeiro elemento – Retirar o valor 8 da lista (valor, não posição)– Inserir -4 no início– Retirar o elemento na quinta posição

9 3

Page 18: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Operações sobre Listas Sequenciais

• public boolean isEmpty()– verifica se a lista está vazia

• public boolean isFull()– verifica se a lista está cheia

• public int getSize()– retorna o número de nós da lista

• public int get(int index)– retorna nó da posição index

Page 19: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Operações sobre Listas Sequenciais

• public boolean insert(int element)– insere dado no final da lista

• public boolean insert(int element, int pos)– insere dado na posição especificada

• public boolean remove(int index)– remove nó na posição especificada

• public void print()– exibe o conteúdo da lista

Page 20: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

• Supondo a existência da classe SequentialList, desenhe a lista criada através do código abaixo (a saída do programa):

public static void main(String args[]){ SequentialList l = new SequentialList(5); l.insert(1); l.insert(2); l.insert(4); l.insert(3, 2); l.remove(0); l.print();}

Page 21: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

public class SequentialList { private int list[]; private int last = -1;

/* Método Construtor */ public SequentialList(int size) { list = new int[size]; }

//demais métodos...

}

Page 22: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

• Verificar se está vazia, se está cheia e o tamanho– Vazia:

/* Retorna: - true se a lista está vazia - false caso contrário */

public boolean isEmpty() { if (last == -1) return true; else return false;}

Page 23: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

• Verificar se está vazia, se está cheia e o tamanho– Cheia:

/* Retorna: - true se a lista está cheia - false caso contrário */

public boolean isFull() { if (last == list.length - 1) return true; else return false;}

Page 24: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

• Verificar se está vazia, se está cheia e o tamanho– Tamanho:

/* Retorna o número de elementos na lista */

public int getSize() { return last + 1; //pois começa em 0}

Page 25: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

• Retornar uma posição específica

/* Retorna o elemento na posição especificada. */

public int get (int index) { if(isEmpty()){ System.out.println(“ERRO: Lista vazia!”); return 0; } if(index < 0 || index > last){ System.out.println(“ERRO: Índice inválido!”); return 0; } return list[index];}

Page 26: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Lista Sequencial

• Inserir elementos– No final

/* Retorna true se o elemento foi inserido no final da listae false caso contrário. */

public boolean insert (int element) { if(isFull()) return false; //não conseguiu inserir: lista cheia last++; list[last] = element; //insere o elemento return true;}

Page 27: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

/* Retorna true se o elemento foi inserido na lista e false caso contrário. */

public boolean insert (int element, int pos) { if (isFull() || pos <0 || pos > last + 1) return false; for (int i = last + 1; i > pos; i--) { list[i] = list[i - 1]; } last++; list[pos] = element; return true;}

Lista Sequencial

• Inserir elementos– Em uma determinada posição

Page 28: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

/* Retorna true se foi possível remover e false caso contrário */

public boolean remove (int index) { if (isEmpty()) return false; if (index < 0 || index > last) return false; int numberofElements = last - index; if (numberofElements > 0) { System.arraycopy(list, index + 1, list, index, numberofElements); } last--; return true;}

Lista Sequencial

• Remover elementos– Em uma determinada posição

Page 29: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

public void print() { for (int i = 0; i <= last; i++) System.out.println(list[i]);}

Lista Sequencial

• Exibir elementos de uma lista

Page 30: Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Programação II – Prof. Mateus Raeder

Exercícios: Lista Sequencial• No método main de uma classe qualquer, crie um objeto

SequentialList representando uma lista sequencial de números. Realize, então, as seguintes operações: – * inserir os números 23, -3, 1, 50 e 5;– imprimir todos os números da lista;– * inserir o número 4 no fim da lista;– * ler um número e inseri-lo no início da lista;– imprimir o tamanho da lista;– * excluir o elemento da posição 9;– * excluir o elemento da posição 3;– * inserir o número 10 na segunda posição da lista.

• Desenhe como fica a lista após a realização de cada operação marcada com um * (inclusive o ponteiro last)