Buscar

Trabalho de Listas Lineares

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 12 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 12 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 12 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Trabalho de Listas Lineares 
	Prof: Diassis Rodrigo
1.Listas Lineares
Dentre as estruturas de dados não primitivas, as listas lineares são as de
manipulação mais simples.
Uma lista linear agrupa informações referentes a um conjunto de elementos
que, de alguma forma, se relacionam entre si. Ela pode se constituir, por exemplo, de
informações sobre os funcionários de uma empresa, sobre notas de compras, itens de
estoque, notas de alunos, etc.
Uma lista linear, ou tabela, é então um conjunto de n ≥ 0 nós L[1], L[2], ...,
L[n] tais que suas propriedades estruturais decorrem, unicamente, da posição relativa
dos nós dentro da seqüência linear. Tem-se:
• se n > 0, L[1] é o primeiro nó;
• para 1 < K ≤ n, o nó L[k] é precedido por L[k-1];
• Operações Mais Freqüentes Em Listas:
• busca;
• inclusão;
• remoção;
São operações básicas, que precisam de algoritmos eficientes.
• Outras Operações:
• alteração;
• combinação de duas listas;
• ordenação;
• determinação do primeiro e do último nó da lista.
• Tipo de armazenamento de uma lista:
• alocação seqüencial;
• alocação encadeada.
• Exemplos de operações possíveis:
– Criar uma lista linear vazia.
– Inserir um novo item imediatamente após o i-ésimo item.
– Retirar o i-ésimo item.
– Localizar o i-ésimo item para examinar e/ou alterar o conteúdo de seus componentes.
– Combinar duas ou mais listas lineares em uma lista única.
– Partir uma lista linear em duas ou mais listas.
– Fazer uma cópia da lista linear.
– Ordenar os itens da lista em ordem ascendente ou 
descendente, de acordo com alguns de seus componentes.
– Pesquisar a ocorrência de um item com um valor particular 
em algum componente.
2.Alocação Sequencial
Maneira mais simples de se manter uma lista na memória. Como a
implementação de alocação seqüencial em linguagens de alto nível é geralmente
realizada com reserva de memória ⇒ alocação estática.
Ex. 1: Considere uma lista L de n elementos.
2.1.Lista com alocação sequencial e estática: 
Vantagens e desvantagens
• Vantagem: economia de memória (os ponteiros 
são implícitos nesta estrutura).
• Desvantagens:
– custo para inserir ou retirar itens da lista, que 
pode causar um deslocamento de todos os itens, 
no pior caso;
– em aplicações em que não existe previsão sobre 
o crescimento da lista, a utilização de arranjos 
em linguagens como o Pascal e o C pode ser 
problemática pois, neste caso, o tamanho 
máximo da lista tem de ser definido em tempo de 
compilação.
2.2.Listas com alocação não sequencial e dinâmica
• Cada item é encadeado com o seguinte mediante 
uma variável do tipo Ponteiro.
• Permite utilizar posições não contíguas de memória.
• É possível inserir e retirar elementos sem 
necessidade de deslocar os itens seguintes da lista.
• Há uma célula cabeça para simplificar as operações
sobre a lista
3. Listas Encadeadas
Qualquer estrutura, inclusive listas, que seja armazenada em alocação
encadeada requer o uso de um ponteiro que indique o endereço de seu primeiro nó. O
percurso de uma lista é feito, então, a partir desse ponteiro. A idéia consiste em seguir,
consecutivamente, pelos endereços existentes no campo que indica o próximo nó
(semelhante ao índice da alocação seqüencial). 
Abaixo um algoritimo todo comentado para encadeada simples:
import java.util.Scanner;
 
public class encadeadaSimples {
 
 //Definindo a classe que representará cada elemento da lista
 private static class LISTA {
 
 public int num;
 public LISTA prox;
 }
 
 public static void main(String[] args) {
 Scanner entrada = new Scanner(System.in);
 // a lista está vazia, logo, objeto inicio têm o valor null, o objeto inicio conterá o endereço do primeiro elemento da lista
 LISTA inicio = null;
 // o objeto fim conterá o endereço do último elemento da lista
 LISTA fim = null;
 // o objeto aux é um objeto auxiliar
 LISTA aux;
 // o objeto anterior é um objeto auxiliar
 LISTA anterior;
 // apresenta o menu de opções
 int op, numero, achou;
 do {
 System.out.println("\nMENU DE OPÇÕES\n");
 System.out.println("1 - Inserir no início da lista");
 System.out.println("2 - Inserir no final da lista");
 System.out.println("3 - Consultar toda a lista");
 System.out.println("4 - Remover da lista");
 System.out.println("5 - Esvaziar a lista");
 System.out.println("6 - Sair");
 System.out.print("Digite sua opção: ");
 op = entrada.nextInt();
 if (op < 1 || op > 6) {
 System.out.println("Opção inválida!!");
 } else {
 if (op == 1) {
 System.out.println("Digite o número a ser inserido no início da lista");
 LISTA novo = new LISTA();
 novo.num = entrada.nextInt();
 if (inicio == null) {
 // a lista esta vazia e o elemento inserido será o primeiro e o último da lista
 inicio = novo;
 fim = inicio;
 novo.prox = null;
 } else {
 // a lista já contem elementos e o novo elemento será inserido no início da lista
 novo.prox = inicio;
 inicio = novo;
 }
 System.out.println("Número inserido no início da lista!!");
 }
 if (op == 2) {
 System.out.println("Digite o número a ser inserido no fim da lista: ");
 LISTA novo = new LISTA();
 novo.num = entrada.nextInt();
 if (inicio == null) {
 // a lista estava vazia e o elemento inserido será o primeiro e o último
 inicio = novo;
 fim = novo;
 novo.prox = null;
 } else {
 // a lista já contém elementos e o novo elemento será inserido no fim da lista
 fim.prox = novo;
 fim = novo;
 fim.prox = null;
 }
 System.out.println("Número inserido no fim da lista!!");
 }
 if (op == 3) {
 if (inicio == null) {
 // a lista está vazia
 System.out.println("Lista vazia!!");
 } else {
 // a lista contém elementos e estes serão mostrados do início ao fim
 System.out.println("\nConsultando toda a lista\n");
 aux = inicio;
 while (aux != null) {
 System.out.print(aux.num + " ");
 aux = aux.prox;
 }
 }
 }
 if (op == 4) {
 if (inicio == null) {
 // a lista está vazia
 System.out.println("Lista vazia!!");
 } else {
 // a lista contém elementos e o elemento a ser removido deve ser digitado
 System.out.print("\nDigite o elemento a ser removido: ");
 numero = entrada.nextInt();
 // todos as ocorrências da lista, iguais ao número digitado serão removidas
 aux = inicio;
 anterior = null;
 achou = 0;
 while (aux != null) {
 if (aux.num == numero) {
 // o número digitado foi encontrado na lista e será removido
 achou = achou + 1;
 if (aux == inicio) {
 // o número a ser removido é o primeiro da lista
 inicio = aux.prox;aux = inicio;
 } else if (aux == fim) {
 // o número a ser removido é o último da lista
 anterior.prox = null;
 fim = anterior;
 aux = null;
 } else {
 // o número a ser removido está no meio da lista
 anterior.prox = aux.prox;
 aux = aux.prox;
 }
 } else {
 anterior = aux;
 aux = aux.prox;
 }
 }
 if (achou == 0) {
 System.out.println("Número não encontrado");
 } else if (achou == 1) {
 System.out.println("Número removido 1 vez");
 } else {
 System.out.println("Numero removido " + achou + " vezes");
 }
 }
 }
 if (op == 5) {
 if (inicio == null) {
 // a lista está vazia
 System.out.println("Lista vazia!!");
 } else {
 // a lista será esvaziada
 inicio = null;
 System.out.println("Lista esvaziada");
 }
 }
 
 }
 
 } while (op != 6);
 }
}
3.1.Listas Duplamente Encadeadas
Duplamente encadeada é quando possuem dois ponteiros um para o anterior e o outro para o próximo no primeiro elemento o anterior e apontado para o vazio e o ultimo a elemento aponta para o vazio, uma vantagem de uma lista duplamente encadeada e que pos ser percorrido todos os elementos nos ambos os sentidos, na figura abaixo ilustra uma lista duplamente encadeada.
A lista duplamente encadeada incorpora um novo campo de ponteiro. Os
campos de ponteiros tomam os nomes de ant e post (nó anterior e nó seguinte,
respectivamente).
Abaixo um algoritimo para melhor entender o funcionamento do mesmo:
import java.util.Scanner;
 
public class duplamenteEncadeada {
 
 //Definindo a classe que representará cada elemento da lista
 private static class LISTA {
 
 public int num;
 public LISTA prox;
 public LISTA ant;
 }
 
 public static void main(String[] args) {
 Scanner entrada = new Scanner(System.in);
 // a lista está vazia, logo, objeto inicio têm o valor null, o objeto inicio conterá o endereço do primeiro elemento da lista
 LISTA inicio = null;
 // o objeto fim conterá o endereço do último elemento da lista
 LISTA fim = null;
 // o objeto aux é um objeto auxiliar
 LISTA aux;
 // o objeto anterior é um objeto auxiliar
 LISTA anterior;
 // apresenta o memnu de opções
 int op, numero, achou;
 do {
 System.out.println("\nMENU DE OPÇÕES\n");
 System.out.println("1 - Inserir no início da lista");
 System.out.println("2 - Inserir no fim da lista");
 System.out.println("3 - Consultar a lista do início ao fim");
 System.out.println("4 - Consultar a lista do fim ao início");
 System.out.println("5 - Remover da lista");
 System.out.println("6 - Esvaziar a lista");
 System.out.println("7 - Sair");
 System.out.print("Digite sua opção: ");
 op = entrada.nextInt();
 if (op < 1 || op > 7) {
 System.out.println("Opção inválida!!");
 } else {
 if (op == 1) {
 System.out.println("Digite o número a ser inserido no início da lista");
 LISTA novo = new LISTA();
 novo.num = entrada.nextInt();
 if (inicio == null) {
 // a lista esta vazia e o elemento inserido será o primeiro e o último da lista
 inicio = novo;
 fim = novo;
 novo.prox = null;
 novo.ant = null;
 } else {
 // a lista já contém elementos e o novo elemento será inserido no início da lista
 novo.prox = inicio;
 inicio.ant = novo;
 novo.ant = null;
 inicio = novo;
 }
 System.out.println("Número inserido no início da lista!!");
 }
 if (op == 2) {
 System.out.println("Digite o número a ser inserido no fim da lista: ");
 LISTA novo = new LISTA();
 novo.num = entrada.nextInt();
 if (inicio == null) {
 // a lista estava vazia e o elemento inserido será o primeiro e o último
 inicio = novo;
 fim = novo;
 novo.prox = null;
 novo.ant = null;
 } else {
 // a lista já contém elementos e o novo elemento será inserido no fim da lista
 fim.prox = novo;
 novo.ant = fim;
 novo.prox = null;
 fim = novo;
 }
 System.out.println("Número inserido no fim da lista!!");
 }
 if (op == 3) {
 if (inicio == null) {
 // a lista está vazia
 System.out.println("Lista vazia!!");
 } else {
 // a lista contém elementos e estes serão mostrados do início ao fim
 System.out.println("\nConsultando a lista do início ao fim\n");
 aux = inicio;
 while (aux != null) {
 System.out.print(aux.num + " ");
 aux = aux.prox;
 }
 }
 }
 if (op == 4) {
 if (inicio == null) {
 // a lista está vazia
 System.out.println("Lista vazia!!");
 } else {
 // a lista contém elementos e estes serão mostrados do fim ao início
 System.out.println("\nConsultando a lista do fim ao início\n");
 aux = fim;
 while (aux != null) {
 System.out.print(aux.num + " ");
 aux = aux.ant;
 }
 }
 }
 if (op == 5) {
 if (inicio == null) {
 // a lista está vazia
 System.out.println("Lista vazia!!");
 } else {
 // a lista contém elementos e o elemento a ser removido deve ser digitado
 System.out.print("\nDigite o elemento a ser removido: ");
 numero = entrada.nextInt();
 // todos as ocorrências da lista, iguais ao número digitado serão removidas
 aux = inicio;
 achou = 0;
 while (aux != null) {
 if (aux.num == numero) {
 // o número digitado foi encontrado na lista e será removido
 achou = achou + 1;
 if (aux == inicio) {
 // o número a ser removido é o primeiro da lista
 inicio = aux.prox;
 if(inicio != null) {
 inicio.ant = null;
 }
 aux = inicio;
 } else if (aux == fim) {
 // o número a ser removido é o último da lista
 fim = fim.ant;
 fim.prox = null;
 aux = null;
 } else {
 // o número a ser removido está no meio da lista
 aux.ant.prox = aux.prox;
 aux.prox.ant = aux.ant;
 aux = aux.prox;
 }
 } else {
 aux = aux.prox;
 }
 }
 if (achou == 0) {
 System.out.println("Número não encontrado");
 } else if (achou == 1) {
 System.out.println("Número removido 1 vez");
 } else {
 System.out.println("Numero removido " + achou + " vezes");
 }
 }
 }
 if (op == 6) {
 if (inicio == null) {
 // a lista está vazia
 System.out.println("Lista vazia!!");
 } else {
 // a lista será esvaziada
 inicio = null;
 System.out.println("Lista esvaziada");
 }
 }
 
 }
 
 } while (op != 7);
 }
}
3.2.Listas Circulares
A busca em uma lista ordenada, vista anteriormente, pode ser considerada
pouco eficiente quando comparada às outras buscas anteriormente mencionadas. Uma
pequena modificação na estrutura física da lista pode ser de grande auxílio: obrigar o
último nó da lista a apontar para o nó-cabeça, criando uma lista circular encadeada.
 
Desta forma, o teste de fim de lista nunca é satisfeito. A preocupação passa a
ser um critério de parada que possa ser incorporado ao teste da busca propriamente dita.
A solução é colocar a chave procurada no nó-cabeça, de forma que uma resposta
positiva seja sempre encontrada.
4.Referencias Bibliográficas
[1] http://manfred.com.br/index.php/bsi/estrutura-de-dados-i/132-aula-04-listas-simplesmente-encadeada-duplamente-encadeada-e-circular-em-java
[2] http://www.ebah.com.br/content/ABAAAfL0YAK/aula18-listas-encadeadas-ii-busca-linear-binaria
[3] http://www.uems.br/docentes/rmmuller/listalin.pdf
[4] https://www.youtube.com/watch?v=c42_2KnQNpY
[5] https://www.youtube.com/watch?v=ekMsPHwzzlE
[
6] https://www.youtube.com/watch?v=vqJziTFXrvU
[7] https://www.youtube.com/watch?v=MydQEx9BeK8
[8] http://www.inf.ufes.br/~pdcosta/ensino/2012-1-estruturas-de-dados/slides/Aula9(listas).pdf
				
				
				Índice
1. Listas Lineares
2. Alocação sequencial
2.1. Lista com alocação sequencial e estática
2.2. Listas com alocação não sequencial e dinâmica
3. Listas Encadeadas
3.1. Listas Duplamente Encadeadas
3.2. Listas Circulares
4.Referencias Bibliográficas
		
	Trabalho de Listas Lineares 	
	prof: Diassis Rodrigo
Nome: Renan Longhi Marmo 			RA: 2014016871
Nome: Rinaldo Gama				RA: 2014016781
								Data : 19/11/2014

Outros materiais