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 10 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