Programação II
Prof. Mateus Raeder
Universidade do Vale do Rio dos Sinos
- São Leopoldo -
Tipos de dados
Tipos de dados
Primitivos: a partir dos quais podemos definir
os demais
Estrutura de dados: constituídos de dados
primitivos e/ou estruturas
• 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
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
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]
Programação II – Prof. Mateus Raeder
Listas Lineares
1
2
3
4
n
...
• 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
Programação II – Prof. Mateus Raeder
Estrutura dos nós
• Estrutura interna é abstraída
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
Programação II – Prof. Mateus Raeder
Listas Lineares: Classificação
Listas lineares gerais
SEM restrição de inserção e remoção de
elementos
Listas lineares
Listas particulares
COM restrição de inserção e remoção de
elementos
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
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)
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
Programação II – Prof. Mateus Raeder
Listas: tipos de armazenamento
Lista sequencial
1
2
3
4
n
...
Lista encadeada
1
2
3
4
n
...
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
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
Programação II – Prof. Mateus Raeder
Listas Lineares Gerais com Alocação Estática
ou Listas Sequenciais
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
Programação II – Prof. Mateus Raeder
Exercício Lista Sequencial
9
3
• 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
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
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
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();
}
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...
}
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;
}
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;
}
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
}
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];
}
Programação II – Prof. Mateus Raeder
Lista Sequencial
• Inserir elementos
– No final
/* Retorna true se o elemento foi inserido no final da lista
e 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;
}
Programação II – Prof. Mateus Raeder
Lista Sequencial
• Inserir elementos
– Em uma determinada posição
/* 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;
}
Programação II – Prof. Mateus Raeder
Lista Sequencial
• Remover elementos
– Em uma determinada posição
/* 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;
}
Programação II – Prof. Mateus Raeder
Lista Sequencial
• Exibir elementos de uma lista
public void print() {
for (int i = 0; i <= last; i++)
System.out.println(list[i]);
}
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)
Programação II – Prof. Mateus Raeder
Download

Lista Sequencial