Você está aqui: Java ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Dados - Listas Ligadas |
Como inserir um nó em qualquer posição de uma lista duplamente encadeada em Java - Escreva um programa Java que - Exercícios Resolvidos de JavaQuantidade de visualizações: 627 vezes |
Pergunta/Tarefa: Escreva um programa Java que cria uma lista dinâmica duplamente ligada (lista duplamente encadeada) e peça para o usuário inserir 5 elementos do tipo inteiro. Em seguida peça para o usuário informar um índice e um novo elemento e insira tal elemento no índice informado. Finalmente faça a varredura da lista e mostre os elementos, antes e depois da nova inserção. Faça a validação dos índices para que ele não saia da faixa permitida. Sua saída deve ser parecida com: Inserindo na lista duplamente encadeada Informe o 1.o valor: 6 Informe o 2.o valor: 9 Informe o 3.o valor: 1 Informe o 4.o valor: 3 Informe o 5.o valor: 7 Valores na lista duplamente encadeada: 6 9 1 3 7 Inserindo um elemento no índice k Informe o índice desejado: 2 Informe o valor do nó: 4 Valores na lista duplamente ligada: 6 9 4 1 3 7 Na saída podemos ver que o índice 2 corresponde ao terceiro elemento da lista duplamente encadeada. Por isso o valor 1 foi empurrado para a frente para abrir espaço para o valor 4. Se o índice 0 fosse informado, o número 6 seria empurrado para a frente e o nó com valor 4 passaria a ser o início da lista duplamente ligada. Veja a resolução comentada deste exercício usando Java: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- package estudos; import java.util.Scanner; // classe interna para representar os nós da // lista duplamente encadeada class No { int valor; // valor armazenado no nó No anterior; // aponta para o nó anterior No proximo; // aponta para o próximo nó // construtor do nó public No(int valor){ this.valor = valor; this.anterior = null; this.proximo = null; } } public class Estudos { // referência para o início da lista duplamente ligada static No inicio; // referência para o final da lista duplamente ligada static No fim; public static void main(String args[]){ // para ler a entrada do usuário Scanner entrada = new Scanner(System.in); // vamos inserir 5 valores inteiros na lista // duplamente ligada int valor; System.out.println("Inserindo na lista duplamente encadeada\n"); for (int i = 0; i < 5; i++) { System.out.print("Informe o " + (i + 1) + ".o valor: "); valor = Integer.parseInt(entrada.nextLine()); // vamos inserir este valor no final da lista // duplamente encadeada inserirFinal(valor); } // vamos exibir os valores na lista ligada System.out.print("\nValores na lista duplamente encadeada: "); exibirLista(); // vamos inserir um novo elemento no índice informado System.out.println("\nInserindo um elemento no índice k\n"); System.out.print("Informe o índice desejado: "); int indice = Integer.parseInt(entrada.nextLine()); // o índice é válido? if ((indice < 0) || (indice > tamanhoLista() - 1)) { System.out.println("O índice é inválido."); } else { // vamos inserir o novo nó no índice indicado System.out.print("Informe o valor do nó: "); valor = Integer.parseInt(entrada.nextLine()); inserirIndice(indice, valor); // vamos exibir os valores na lista ligada System.out.print("\nValores na lista duplamente ligada: "); exibirLista(); } } // função que permite inserir um novo nó em // índice informado pelo usuário public static void inserirIndice(int indice, int valor) { // o primeiro passo é construir um novo nó No novo = new No(valor); novo.anterior = null; // não possui nó anterior novo.proximo = null; // não possui nó próximo // temos que inserir no início da lista? if (indice == 0) { // a lista ainda está vazia? if (inicio == null) { // tanto o início quanto o fim da lista // apontam para o novo nó inicio = novo; fim = novo; } else { // a lista duplamente ligada possui um ou mais nós. // vamos inserir no início, antes deles // o campo proximo do novo nó aponta para o // início da lista novo.proximo = inicio; // o campo anterior do início da lista aponta // para o novo nó inicio.anterior = novo; // e finalmente o início da lista aponta para o // novo nó inicio = novo; } } else { // vamos inserir no índice específicado, talvez no // meio ou um nó antes do final da lista // duplamente encadeada // primeiro apontamos para o início da lista No temp = inicio; // encontramos o índice desejado. Note que paramos // um nó antes da posição a ser inserida for (int i = 1; i < indice; i++) { temp = temp.proximo; } // agora que paramos um nó antes da posição que vamos // inserir, o campo proximo do novo nó aponta para // o proximo do nó temporário novo.proximo = temp.proximo; // o campo anterior do novo nó aponta para o // nó temporário novo.anterior = temp; // o campo anterior do nó à frente do novo nó // aponta para ele (o novo nó) novo.proximo.anterior = novo; // e o próximo do nó temporário aponta para // o novo nó temp.proximo = novo; } } // esta função permite inserir um novo nó no // final de uma lista duplamente encadeada public static void inserirFinal(int valor) { // o primeiro passo é construir um novo nó No novo = new No(valor); novo.anterior = null; // não possui nó anterior novo.proximo = null; // não possui nó próximo // a lista ainda está vazia? if (inicio == null) { // tanto o início quanto o fim da lista // apontam para o novo nó inicio = novo; fim = novo; } else { // o campo anterior do novo nó aponta para o // final da lista novo.anterior = fim; // o campo proximo do final da lista aponta // para o novo nó fim.proximo = novo; // finalmente o fim da lista aponta para // o novo nó fim = novo; } } // esta função permite exibir os valores de todos // os nós da lista duplamente encadeada public static void exibirLista() { // apontamos para o início da lista No temp = inicio; // a lista está vazia? if (inicio == null) { System.out.println("A lista está vazia"); return; } // enquanto temp for diferente de null while(temp != null) { // mostramos o valor do nó atual System.out.print(temp.valor + " "); // e pulamos para o nó seguinte temp = temp.proximo; } } // esta função permite retornar a quantidade // de nós na lista duplamente encadeada public static int tamanhoLista() { // para retornar a quantidade de nós int quantidade = 0; // apontamos para o início da lista No temp = inicio; // a lista está vazia? if (inicio == null) { return 0; } // enquanto temp for diferente de null while(temp != null) { // aumentamos a quantidade quantidade++; // e pulamos para o nó seguinte temp = temp.proximo; } // retorna o tamanho da lista duplamente encadeada return quantidade; } } |
Link para compartilhar na Internet ou com seus amigos: |
Java ::: Dicas & Truques ::: Imagens e Processamento de Imagens |
Manipulação de imagens em Java - Como converter uma imagem JPG colorida para uma imagem na escala cinza (gray scale)Quantidade de visualizações: 11998 vezes |
Uma das formas mais comuns de se converter uma imagem colorida para uma imagem na escala cinza (grayscale) é desenhar a imagem colorida em um BufferedImage do tipo TYPE_BYTE_GRAY. Veja o resultado na imagem abaixo: E agora o código completo para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- package arquivodecodigos; import java.awt.*; import java.io.*; import java.awt.image.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.*; public class Estudos extends JFrame{ private BufferedImage imagem; private BufferedImage imagemCinza; AreaImagem areaImagem; public Estudos(){ super("Estudos Java"); Container c = getContentPane(); c.setLayout(new BorderLayout()); JButton btn = new JButton("Carregar Imagem"); btn.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ JFileChooser fc = new JFileChooser(); int res = fc.showOpenDialog(null); if(res == JFileChooser.APPROVE_OPTION){ File arquivo = fc.getSelectedFile(); imagem = null; try{ imagem = ImageIO.read(arquivo); } catch(IOException exc){ JOptionPane.showMessageDialog(null, "Erro ao carregar a imagem: " + exc.getMessage()); } if(imagem != null){ areaImagem.imagem = imagem; areaImagem.repaint(); } } } } ); JButton btn2 = new JButton("Converter Escala Cinza"); btn2.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ converterEscalaCinza(); } } ); JPanel painel = new JPanel(); painel.setLayout(new FlowLayout()); painel.add(btn); painel.add(btn2); c.add(painel, BorderLayout.SOUTH); // Cria a área de exibição da imagem areaImagem = new AreaImagem(); c.add(areaImagem, BorderLayout.CENTER); setSize(400, 300); setVisible(true); } public void converterEscalaCinza(){ imagemCinza = new BufferedImage( imagem.getWidth(), imagem.getHeight(), BufferedImage.TYPE_BYTE_GRAY); Graphics g = imagemCinza.getGraphics(); g.drawImage(imagem, 0, 0, null); g.dispose(); areaImagem.imagem = imagemCinza; areaImagem.repaint(); } public static void main(String args[]){ Estudos app = new Estudos(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } // Sub-classe de JPanel para exibir a imagem class AreaImagem extends JPanel{ public BufferedImage imagem; public void paintComponent(Graphics g){ super.paintComponent(g); // desenha a imagem no JPanel g.drawImage(imagem, 0, 0, this); } } |
Java ::: Tratamento de Erros ::: Erros de Tempo de Execução |
Como tratar o erro IndexOutOfBoundsException do Java - A exceção IndexOutOfBoundsException da linguagem JavaQuantidade de visualizações: 17386 vezes |
A exceção IndexOutOfBoundsException é uma exceção (erro) que acontece quando fornecemos um índice fora dos limites permitidos para o acesso de elementos em um vetor, matriz, string ou demais coleções. Lembre-se de que os índices em Java começam em 0 e vão até a quantidade de elementos menos 1. Antes de vermos os exemplos, observe a posição da classe pública IndexOutOfBoundsException na hierarquia de classes da plataforma Java: java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IndexOutOfBoundsException Esta classe implementa a interface Serializable e possui duas sub-classes conhecidas: ArrayIndexOutOfBoundsException e StringIndexOutOfBoundsException. Veja um exemplo no qual tentamos acessar um elemento de um vetor usando um índice inválido: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- public class Estudos{ public static void main(String args[]){ // um array de quatro elementos int[] valores = {5, 23, 76, 3}; // vamos fornecer um índice inválido System.out.println(valores[4]); System.exit(0); } } Este código compila normalmente. Porém, ao tentarmos executá-lo, temos a seguinte mensagem de erro: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 at Estudos.main(Estudos.java:7) A forma mais adequada de corrigir este erro é fornecendo um valor de índice que realmente esteja na faixa permitida. Veja agora o mesmo trecho de código usando uma string: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- public class Estudos{ public static void main(String args[]){ String nome = "Java"; // vamos fornecer um índice inválido System.out.println(nome.charAt(4)); System.exit(0); } } Compile este código e execute-o. Você verá a seguinte mensagem de erro: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(Unknown Source) at Estudos.main(Estudos.java:6) Vamos fazer o mesmo usando uma ArrayList: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- import java.util.ArrayList; public class Estudos{ public static void main(String[] args){ // cria uma ArrayList que conterá strings ArrayList<String> nomes = new ArrayList<String>(); // adiciona itens na lista nomes.add("Carlos"); nomes.add("Maria"); nomes.add("Fernanda"); nomes.add("Osmar"); // fornecemos um índica inválido String nome = nomes.get(4); System.out.println("O valor obtido foi: " + nome); System.exit(0); } } Compile, execute e veja a mensagem de erro: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 at java.util.ArrayList.RangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at Estudos.main(Estudos.java:15) Veja que no caso do vetor, a exceção lançada foi ArrayIndexOutOfBoundsException, no caso da string a exceção foi StringIndexOutOfBoundsException e no caso do ArrayList tivemos IndexOutOfBoundsException. Resolvemos abordar estas três exceções em apenas uma anotação para que você perceba a semelhança entre elas. |
Java ::: Desafios e Lista de Exercícios Resolvidos ::: Java Básico |
Exercícios Resolvidos de Java - Um programa que lê dois números inteiros e mostra o menorQuantidade de visualizações: 4155 vezes |
Pergunta/Tarefa: Escreva um programa Java que solicita dois números inteiros ao usuário e mostra o menor deles. Mostre uma mensagem informando se os dois números são iguais. Sua saída deverá ser parecida com: Informe o primeiro número: 34 Informe o segundo número: 30 O menor número é: 30 Informe o primeiro número: 12 Informe o segundo número: 43 O menor número é: 12 Informe o primeiro número: 7 Informe o segundo número: 7 Os dois números são iguais. Veja a resolução comentada deste exercício usando Java: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- package estudos; import java.util.Scanner; public class Estudos { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); // vamos solicitar os dois números inteiros System.out.print("Informe o primeiro número: "); int num1 = Integer.parseInt(entrada.nextLine()); System.out.print("Informe o segundo número: "); int num2 = Integer.parseInt(entrada.nextLine()); // o primeiro número é menor que o segundo? if(num1 < num2){ System.out.println("O menor número é: " + num1); } else if(num2 < num1){ // o segundo número é menor que o primeiro? System.out.println("O menor número é: " + num2); } else{ System.out.println("Os dois números são iguais."); } System.out.println("\n"); } } |
Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de Java |
Veja mais Dicas e truques de Java |
Dicas e truques de outras linguagens |
C - Como alocar memória para instâncias de uma estrutura (struct) e acessá-las usando ponteiros em C |
Códigos Fonte |
Software de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |